【数据结构与算法】二叉树基础OJ--下(巩固提高)

简介: 【数据结构与算法】二叉树基础OJ--下(巩固提高)

KY11 二叉树遍历

题目来源:二叉树遍历_牛客题霸_牛客网 (nowcoder.com)


题目描述:

   

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:


输入包括1行字符串,长度不超过100。


输出描述:


可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1


输入:abc##de#g##f###
输出:c b e g d f a

解题思路:

先来复习一遍前序遍历,在此基础上,遍历一个比较难的字符串。


1322051bec6744e1b6fa4d7978fa94aa.png


画出其前序遍历图:


4b74ab4236a7419699fbaf5974595cf9.png


画出其前序遍历递归图(省略一部分同理的),剩下的可以根据上面的前序遍历图可求出



747aaea4cc1441deb29ae6f0c0445312.png

有了上面的基础,我们写出代码实现部分:


typedef int BTDataType;
typedef struct BTreeNode
{
    int val;
    struct BTreeNode* left;
    struct BTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
    BTNode* root=(BTNode*)malloc(sizeof(BTNode));
    if(root == NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    root->val=x;
    root->left =NULL;
    root->right = NULL;
    return root;
}
BTNode* CreateTree(char* a,int* pi)
{
    if(a[(*pi)] =='#')
    {
        (*pi)++;
        return NULL;
    }
    BTNode* root = BuyNode(a[(*pi)]);
    (*pi)++;
    root->left  = CreateTree(a, pi);
    root->right = CreateTree(a,pi);
    return root;
}
void InOrder(BTNode* root)
{
    if(root == NULL)
    {
        return ;
    }
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}
int main()
{
    char a[100];
    scanf("%s",a);
    int i=0;
    BTNode* root=CreateTree(a,&i);
    InOrder(root);
    printf("\n");
}

执行:


3e204aa1d1a7423fa7fdf22cc2b1e1ed.png


leetcode 94.二叉树中序遍历(数组存储)

题目来源:94. 二叉树的中序遍历 - 力扣(LeetCode)


题目描述:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。


示例:


d346b974966a4094aaa4eacbc17564e2.png

解题思路:

跟上一篇的前序遍历相差不大,就是将参数换个位置,其它不便说明。


代码实现:


int TreeSize(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    return TreeSize(root->left) + TreeSize(root->right) +1;
}
void _inorder(struct TreeNode* root,int* a,int* pi)
{
    if(root==NULL)
    {
        return ;
    }
    _inorder(root->left,a,pi);
    a[(*pi)++]=root->val;
     _inorder(root->right,a,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = TreeSize(root);
    int* a=(int*)malloc(*returnSize *sizeof(int));
    int i=0;
    _inorder(root,a,&i);
    return a;
}

代码执行:



cd14fa091f66428c8cd2d06cb4daeed8.png

leetcode 145二叉树的后序遍历(数组存储)

题目来源:145. 二叉树的后序遍历 - 力扣(LeetCode)


题目描述:

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。


示例:



28cb48a2a01b4289b7c3566a93cce161.png

解题思路:

跟上一篇的前序遍历相差不大,就是将参数换个位置,其它不便说明。


代码实现:


int TreeSize(struct TreeNode* root)
{
    return root==NULL ? 0 : TreeSize(root->left) + TreeSize(root->right)+ 1;
}
void _postorder(struct TreeNode*root,int* a,int* pi)
{
    if(root==NULL)
    {
        return ;
    }
    _postorder(root->left,a,pi);
    _postorder(root->right,a,pi);
    a[(*pi)++]=root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize=TreeSize(root);
    int* a=(int*)malloc(*returnSize*sizeof(struct TreeNode));
    int i=0;
    _postorder(root,a,&i);
    return a;
}

b2faec73e25c4b03914ddde2e0d099fd.png

   

相关文章
|
9月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
308 10
 算法系列之数据结构-二叉树
|
10月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
344 64
|
11月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
359 12
|
11月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
197 10
|
11月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
537 3
|
12月前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
217 5
|
12月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
349 4
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
307 59

热门文章

最新文章