假设二叉树采用二叉链存储结构存储,试设计一个算法,输出从每个叶子节点到根节点的逆路径。
解:采用基于先序遍历的递归方法,用[tex=2.0x1.214]60QgBHhP1bYchH9IcCF6sg==[/tex] 数组存放查找的路径,[tex=3.357x1.214]LnL+or6ZaYFHoiqM1kBkFg==[/tex]存放路径长 度,当找到叶子节点[tex=0.929x1.0]TUjOTrs7MuSrs6dLluR9tw==[/tex]时,由于[tex=0.929x1.0]TUjOTrs7MuSrs6dLluR9tw==[/tex]叶子节点尚未添加到 [tex=2.0x1.214]60QgBHhP1bYchH9IcCF6sg==[/tex]中,因此在输出路径时还需 输出 [tex=4.5x1.143]c6odOqBMcne9uHXEvFxK4g==[/tex] 值; 若 [tex=0.929x1.0]Sd7+hDoehXhbAsh9kdR5ew==[/tex] 不为叶子节点,将 [tex=4.5x1.143]nh/y54vf4pMXVysc5xTYmQ==[/tex] 放入 [tex=2.0x1.214]60QgBHhP1bYchH9IcCF6sg==[/tex]中,然后在左、右子树中查 找。递归算法如下:void AllPath1 ( BTNodc x b, ElcmType path[ ] ,int pathlen){ int i; if (b!= NULL) { if (b- > lchild == NULL s& b- > rchild == NULL)1/ * b为叶子节点 { printf("% c到根节点逆路径:%c ".b-> data, b- >data) ; for ( i = paLllen- 1 ; i>- 0; i-- ) printf(" %c ", path[ i]);printf( "\n" ) ; } else { path[ pathlen] = b- >data; //将当前节点放人路径中 pathlen ++ ; //路径长度增1 AllPath1(b- > lchild, path, pathlen) ; //递归扫描左子树 Al1Path1 (b-> rchild, path, pathlen) ; l/递归扫播右子树 pathlen -- ; //恢复环境 } }}设计如下主函数调用上述算法:void main( ){ BTNode n b; ElemType path[ MaxSize]; CreateBTNode( b,"A(B(DK,G)) ,C(E,F))"); printf("括号表示法: "); DispBTNode( b) ; printf("\n" ); pr intf("输出叶节点逆路径:\n"); AllPath1( b, path, 0) ;}程序执行结果如下:括号表示法:A( B(D(,G)),c(E,F))输出叶节点逆路径:G到根节点逆路径:GDBAE到恨节点逆路径:EC AF到根节点逆路径:FCA
举一反三
内容
- 0
假设二叉树b采用二叉链存储结构存储,试设计一个算法,输出该二叉树中从根节点出发的第一条最长的路径长度,并输出此路径上各节点的值。并分析你设计的算法的时间复杂度和空间复杂度。
- 1
假设二叉树采用二叉链存储结构,[tex=0.429x0.929]r8lLiDb0KHTzu/2y/Au89w==[/tex]指向根节点, [tex=0.571x1.0]FGGpnaR8m8C48rN8O0c7aw==[/tex]所指的节点为任一给定节点设计一个算法,输出从根节点到 [tex=0.571x1.0]FGGpnaR8m8C48rN8O0c7aw==[/tex] 所指节点之间的路径。
- 2
假设二叉树中每个节点值为单个字符,采用二叉链存储结构存储。设计一个算法,求二叉树b中第k层上节点个数。
- 3
假设二叉树采用二叉链存储结构进行存储,设计一个算法,求二叉树[tex=0.429x1.0]JThLUuJ8WswSAPiYZWihWg==[/tex]的宽度(即具有节点数最多的那一层上的节点总数)。
- 4
假设二叉树中每个节点值为单个字符,采用二叉链存储结构存储。设计一个算法,判断值为x的节点与值为y的节点是否互为兄弟,假设这样的节点值是唯一的