chap06-树与二叉树.pptVIP

  • 1
  • 0
  • 约1.96万字
  • 约 124页
  • 2018-03-15 发布于河南
  • 举报
chap06-树与二叉树

* * 2.中序遍历 若森林不空,则 中序遍历森林中第一棵树的子树森林; 访问森林中第一棵树的根结点; 中序遍历森林中(除第一棵树之外)其 余树构成的森林。 即:依次从左至右对森林中的每一棵树进行后根遍历。 * * 树的遍历和二叉树遍历的对应关系 ? 先根遍历 后根遍历 树 二叉树 森林 先序遍历 先序遍历 中序遍历 中序遍历 * * 设树的存储结构为孩子兄弟链表 typedef struct CSNode{ Elem data; struct CSNode *firstchild, *nextsibling; } CSNode, *CSTree; 一、求树的深度 二、输出树中所有从根到叶子的路径 三、建树的存储结构 * * int TreeDepth(CSTree T) { if(!T) return 0; else { h1 = TreeDepth( T-firstchild ); h2 = TreeDepth( T-nextsibling); } } // TreeDepth return(max(h1+1, h2)); 一、求树的深度的算法: * * 二、输出树中所有从根到叶子的路径的算法: A B C D E F G H I J K 例如:对左图所示的树,其输出结果应为: A B E A B F A C A D G H I A D G H J A D G H K * * void AllPath( Bitree T, Stack S ) { if (T) { Push( S, T-data ); if (!T-Lchild !T-Rchild ) PrintStack(S); else { AllPath( T-Lchild, S ); AllPath( T-Rchild, S ); } Pop(S); } // if(T) } // AllPath // 输出二叉树上从根到所有叶子结点的路径 * * void OutPath( Bitree T, Stack S ) { while (T ) { Push(S, T-data ); if ( !T-firstchild ) Printstack(s); else OutPath( T-firstchild, s ); Pop(S); T = T-nextsibling; } // while } // OutPath // 输出森林中所有从根到叶的路径 * * 三、建树的存储结构的算法: 和二叉树类似,不同的定义相应有不同的算法。 假设以二元组(F,C)的形式自上而下、自左而右依次输入树的各边,建立树的孩子-兄弟链表。 * * A B C D E F G 例如: 对下列所示树的输入序列应为: (‘#’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘A’, ‘D’) (‘C’, ‘E’) (‘C’, ‘F’) (‘E’, ‘G’) A B C D (‘#’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘A’, ‘D’) (‘C’, ‘E’) 可见,算法中需要一个队列保存已建好的结点的指针。 E * * void CreatTree( CSTree T ) { T = NULL; for( scanf(fa, ch); ch!=? ?; scanf(fa, ch);) { p = GetTreeNode(ch); // 创建结点 EnQueue(Q, p); // 指针入队列 if (fa == ? ?) T = p; // 所建为根结点 else { } // 非根结点的情况 } // for } // CreateTree … … * * GetHead(Q,s); // 取队列头元素(指针值) while (s-data != fa ) { // 查询双亲结点 DeQueue(Q,s); GetHead(Q,s); } if (!(s-firstchild)) { s-firstchild =

文档评论(0)

1亿VIP精品文档

相关文档