二叉树遍历的本质是怎么样把一个二维结构变成一个一维的线性序列的过程
核心问题:二维结构的线性化
从结点访问其左右儿子结点
访问左儿子后,右儿子结点怎么办?
需要一个寻出结构保存咱叔不访问的结点
存储结构:堆栈、队列
队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
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.类似的,后序和中序遍历序列也可以确定一棵二叉树