二叉树的遍历以及对递归的分析

二叉树的遍历以及对递归的分析

  • 二叉树遍历顺序
    • 前序
    • 中序
    • 后序
    • 层序
    • 如何通过遍历顺序确定一颗二叉树
  • 关于二叉树的递归分析

二叉树的遍历以及对递归的分析_第1张图片

二叉树遍历顺序

二叉树的遍历可以有许多顺序,每一种顺序会遍历出不同的序列,同时要注意,在以下的几种遍历顺序中,任意一种都无法唯一确定一颗二叉树,只有中序遍历+以下3种的任意一种,才能确定出唯一的二叉树,同时,普通的二叉树没有存储的必要,只是通过对其的结构和基本操作的了解,为以后的以二叉树为结构基础的其他数据结构做铺垫

前序

前序遍历的顺序是根–>左–>右
二叉树的遍历以及对递归的分析_第2张图片
遍历序列为**(1,(2,4,N,N,5,N,N),(3,6,N,N,N))**
初学者往往会出现以下问题,比如在遍历完1后遍历2,3…这是错误的,因为树是递归定义的,所以1的左孩子还是其他结点的根结点,而这些其他结点也可能是更多结点的根结点,所以在遍历时要层层深入。

中序

中序遍历的顺序是左–>根–>右
二叉树的遍历以及对递归的分析_第3张图片

遍历序列为**((N,4,N,2,N,5,N),1,(N,6,N,3,N))**

后序

后序遍历的顺序是左–>右–>根
二叉树的遍历以及对递归的分析_第4张图片
遍历序列是**((N,N,4,N,N,5,2),(N,N,6,N,3),1)**

层序

二叉树的遍历以及对递归的分析_第5张图片
层序遍历需要借助队列。
层序遍历的顺序是**(1,2,3,4,5,6)**

如何通过遍历顺序确定一颗二叉树

前面我们说过,单一的排序无法确定一颗唯一的二叉树,必须要中序+任意一种其他遍历顺序,才能确定唯一的二叉树,那么在给定2个序列时,我们该如果确定呢?
二叉树的遍历以及对递归的分析_第6张图片

关于二叉树的递归分析

树是由递归定义的,所以在树的这块内容,递归是解决一些问题的好方法,下面有一些OJ题目
leetcode题目:单值二叉树
如何判断二叉树是否是单值二叉树呢?我们可以通过分治的思路判断,要想整颗二叉树是单值的,那么就要每个子树的根,左孩子,有孩子是相同的,并且左子树和右子树要都为真,该二叉树才是单值的,我们可以写出代码,画出递归展开图。

bool isUnivalTree(struct TreeNode* root)
{
    if(root == NULL)
    {
        return true;
    }
    if(root->left && root->val != root->left->val )
    {
        return false;
    }
    if(root->right && root->val != root->right->val)
    {
        return false;
    }
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

对第一个测试用例进行递归展开
二叉树的遍历以及对递归的分析_第7张图片
二叉树的遍历以及对递归的分析_第8张图片
对于树的递归而言,NULL结点也是要递归的,这点很容易忘记。

你可能感兴趣的:(c语言,数据结构)