层序遍历、遍历二叉树的应用

简介: 层序遍历、遍历二叉树的应用

二叉树遍历的本质是怎么样把一个二维结构变成一个一维的线性序列的过程

核心问题:二维结构的线性化

从结点访问其左右儿子结点

访问左儿子后,右儿子结点怎么办?

需要一个寻出结构保存咱叔不访问的结点

存储结构:堆栈、队列

队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队

 1 void LevelOrderTraversal (BinTree BT)
 2 {
 3     Queue Q; BinTree T;
 4     if(!BT)return ;        //若是空树则直接返回
 5     Q = CreateQueue(MaxSize);    //创建并初始化队列
 6     AddQ(Q, BT);
 7     while(!IsEmptyQ(Q)
 8     {
 9         T = Delete(Q);
10         printf("%d", T->data);    //访问取出的 结点
11         if(T->Left)  AddQ(Q, T->Left);
12         if(T->Right) AddQ(Q, T->Right);
13     }
14 }

遍历二叉树的应用:输出二叉树的叶子节点

 1 void PreOrderPrintLeaves(BinTree BT)
 2 {
 3     if(BT)
 4     {
 5         if(!BT->Left && !BT->right)
 6             printf(“%d", BT->data);
 7         PreOrderPrintLeaves(BT->Left);
 8         PreOrderPrintLeaves(BT->Right);
 9     }
10 }

2.求二叉树的高度

 1 int PostOrderGetHight(BinTree BT)
 2 {
 3     int HL, HR, MaxH;
 4     if(BT)
 5     {
 6         HL = PostOrderGetHight(BT->Left);    //求左子树的高度
 7         HR = PostOrderGetHight(BT->Right);    //求右子树的高度
 8         MaxH = (HL > HR) ? HL : HR;    //取左右字树的较大高度
 9         return (MaxH + 1);            //返回树的高度
10     }
11     else
12         return 0;        //空树的高度为0
13 }

3.二元运算表达式树及其遍历

前缀表达式和后缀表达式都是正确的,中缀表达式会受运算符优先级的影响

但是可以用加括号的方式来消除这种影响


4.先序和中序序列来确定一棵二叉树

根据先序遍历序列第一个结点确定根节点

再根据根节点在中序遍历序列中分割出左右两个子序列

最后对左子树和右子树分别递归使用相同的方法继续分解

5.类似的,后序和中序遍历序列也可以确定一棵二叉树

相关文章
|
7月前
|
存储 算法 Java
二叉树层序遍历
二叉树层序遍历
55 0
|
7月前
|
算法
【二叉树】层序遍历
【二叉树】层序遍历
73 0
05_二叉树的层次遍历II
05_二叉树的层次遍历II
08_N叉树的层序遍历
08_N叉树的层序遍历
04_二叉树的层序遍历
04_二叉树的层序遍历
|
7月前
|
算法
二叉树的递归遍历和非递归遍历
二叉树的递归遍历和非递归遍历
31 0
|
7月前
|
存储 算法 前端开发
589. N 叉树的前序遍历
589. N 叉树的前序遍历
34 0
|
存储 算法 容器
遍历二叉树
大家好,我是王有志。今天我们继续学习数据结构与算法的内容,主要是如何遍历一棵二叉树,那么我们直接开始吧。
63 0
遍历二叉树
|
算法
二叉树的层次遍历
层次遍历就是即逐层地,从左到右访问所有节点
二叉树的层次遍历