《数据结构》复习笔记--二叉树2

前端之家收集整理的这篇文章主要介绍了《数据结构》复习笔记--二叉树2前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

二叉树的非递归遍历:

中序遍历非递归遍历算法
非递归算法实现的基本思路:使用堆栈:

  1. void InOrderTraversal( BinTree BT )
  2. {
  3. BinTree T=BT;
  4. Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
  5. while( T || !IsEmpty(S) )
  6. {
  7. while(T) /*一直向左并将沿途结点压入堆栈*/
  8. {
  9. Push(S,T);
  10. T = T->Left;
  11. }
  12. if(!IsEmpty(S))
  13. {
  14. T = Pop(S); /*结点弹出堆栈*/
  15. printf(“%5d”,T->Data); /*(访问)打印结点*/
  16. T = T->Right; /*转向右子树*/
  17. }
  18. }
  19. }


  1. void InOrderTraversal( BinTree BT )
  2. {
  3. BinTree T=BT;
  4. Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
  5. while( T || !IsEmpty(S) )
  6. {
  7. while(T) /*一直向左并将沿途结点压入堆栈*/
  8. {
  9. Push(S,T);
  10. printf(“%5d”,T->Data); /*(访问)打印结点*/
  11. T = T->Left;
  12. }
  13. if(!IsEmpty(S))
  14. {
  15. T = Pop(S); /*结点弹出堆栈*/
  16. T = T->Right; /*转向右子树*/
  17. }
  18. }
  19. }

  1.  
  1. void PostOrder_NoRecurse(BinTree BT,void (*Do)(BinTree))//非递归实现后序遍历
  2. {
  3. BinTree T = BT;
  4. Stack s = CreateStack(20);
  5. int Tag[20]; //Tag用来标记第几次遇到堆栈内的元素,本身是一个整形堆栈
  6. while(T || !Stack_IsEmpty(s))
  7. {
  8. while(T) //每遇到一个新元素,则到控制到此处
  9. {
  10. Stack_Push(s,T); //放入堆栈并循环至其最左
  11. Tag[s->size - 1] = 0;
  12. T = T->Left;
  13. }
  14. while (!T && !Stack_IsEmpty(s))
  15. {
  16. T = Stack_Pop(s); //取出堆栈中的一个元素,并判断它的Tag
  17. if(Tag[s->size])
  18. {
  19. (*Do)(T); //Tag != 0 说明是第三次遇见该节点,对它进行操作
  20. T = 0; //将T设为0以触发While条件,继续循环
  21. }
  22. else //Tag = 0 说明是第二次遇见(第一次是将Tag设为0)
  23. {
  24. if (!T->Right) (*Do)(T); //如果右儿子不存在,则直接输出
  25. else
  26. {
  27. Stack_Push(s,T); //如果右儿子存在,则将它放回堆栈
  28. Tag[s->size - 1]++; //并累加相应的Tag
  29. }
  30. T = T->Right; //返回右儿子。注意,如果右儿子不存在,则会触发While继续循环
  31. } //否则会判定为遇见新元素跳出循环,继续外部外部的大While循环
  32. }
  33. }
  34. }
由两种遍历序列确定二叉树?

已知三种遍历中的任意两种遍历序列,能否唯一确定一棵二叉树呢?我们知道,无论哪一种,必须要先知道先序遍历。

比如:先序和中序遍历序列来确定一棵二叉树
〖分析〗
1根据先序遍历序列第一个结点确定根结点;
2根据根结点在中序遍历序列中分割出左右两个子序列
3对左子树和右子树分别递归使用相同的方法继续分解。

题目练习:过几天再贴上。

猜你在找的数据结构相关文章