数据结构例程——从根节点到每个叶子节点的路径之逆
来源:互联网 发布:网络修真小说排行榜 编辑:程序博客网 时间:2024/06/11 00:45
本文是数据结构基础系列(6):树和二叉树中第11课时二叉树遍历非递归算法和第12课时层次遍历算法的例程。
问题:设计算法输出从根节点到每个叶子节点的路径之逆。
解法1:利用二叉树后序遍历非递归算法中,每一个叶子节点出现时,栈中从栈顶到栈底,正好是叶子节点到根节点的逆序的性质编写。
[参考解答](btreee.h见算法库)
#include <stdio.h>#include "btree.h"void AllPath1(BTNode *b){ BTNode *St[MaxSize]; BTNode *p; int flag,i,top=-1; //栈指针置初值 if (b!=NULL) { do { while (b!=NULL) //将*b的所有左节点进栈 { top++; St[top]=b; b=b->lchild; } p=NULL; flag=1; while (top!=-1 && flag) { b=St[top]; //取出当前的栈顶元素 if (b->rchild==p) { if (b->lchild==NULL && b->rchild==NULL) { //若为叶子节点,输出栈中所有节点值 for (i=top; i>0; i--) printf("%c->",St[i]->data); printf("%c\n",St[0]->data); } top--; p=b; //p指向刚访问过的节点 } else { b=b->rchild; //b指向右孩子节点 flag=0; } } } while (top!=-1); printf("\n"); }}int main(){ BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("二叉树b: "); DispBTNode(b); printf("\n"); printf("从根节点到每个叶子节点的路径之逆:\n"); AllPath1(b); DestroyBTNode(b); return 0;}
解法2:利用二叉树层次遍历算法的思路解决。
- 采用非环形顺序队列qu
- 层次遍历二叉树
- 将所有已访问过的节点指针进队,并在队列中保存双亲节点的位置。
- 当找到一个叶子节点时,在队列中通过双亲节点的位置输出根节点到该叶子节点的路径之逆。
[参考解答](btreee.h见算法库)
#include <stdio.h>#include "btree.h"void AllPath2(BTNode *b){ struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } qu[MaxSize]; //定义非环形队列 BTNode *q; int front,rear,p; //定义队头和队尾指针 front=rear=-1; //置队列为空队列 rear++; qu[rear].node=b; //根节点指针进入队列 qu[rear].parent=-1; //根节点没有双亲节点 while (front!=rear) //队列不为空 { front++; //front是当前节点*q在qu中的位置 q=qu[front].node; //队头出队列,该节点指针仍在qu中 if (q->lchild==NULL && q->rchild==NULL) { p=front; //输出*q到根节点的路径序列 while (qu[p].parent!=-1) { printf("%c->",qu[p].node->data); p=qu[p].parent; } printf("%c\n",qu[p].node->data); } if (q->lchild!=NULL) //*q节点有左孩子时将其进列 { rear++; qu[rear].node=q->lchild; qu[rear].parent=front; //*q的双亲位置为front } if (q->rchild!=NULL) //*q节点有右孩子时将其进列 { rear++; qu[rear].node=q->rchild; qu[rear].parent=front; //*q的双亲位置为front } }}int main(){ BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("二叉树b: "); DispBTNode(b); printf("\n"); printf("从根节点到每个叶子节点的路径之逆:\n"); AllPath2(b); DestroyBTNode(b); return 0;}
注:在main函数中,创建的用于测试的二叉树如下——
1 0
- 数据结构例程——从根节点到每个叶子节点的路径之逆
- 设计一个算法,输出从每个叶子节点到根节点的逆路径
- 数据结构--二叉树--输出树中从根到每个叶子节点的路径(树遍历算法的应用) .
- 二叉树-输出树中从根到每个叶子节点的路径
- 求二叉树从根节点到每个叶子节点路径上不重复数字的最大个数
- 找出所有从根节点到叶子节点路径和等于n的路径并输出
- 找出所有从根节点到叶子节点路径和等于n的路径并输出
- 二叉树系列——路径系列:根节点到子节点的路径以及根节点到叶子节点的所有路径
- 求从根节点到叶子节点的所有路径组成的数的和
- 打印二叉树从根节点到叶子节点的所有路径
- 二叉搜索树的最短路径,从根节点到叶子节点
- Binary Tree Paths 二叉树所有从跟节点到叶子节点的路径
- 二叉树从根节点到叶子节点路径 C语言
- 网易——求二叉树最大叶子节点到最小叶子节点的距离
- LeetCode257 BinaryTreePaths(打印根节点到叶子节点的左右路径) Java题解
- 二叉树基本操作(输出所有叶子节点到根节点的路径)
- 寻找二叉树中长度为k的路径(根节点到叶子节点)
- 二叉树专题--输出根节点到所有叶子节点的路径
- 在COIDE下使用uCOS-II的一些问题
- win8 64位系统编译boost
- hdu1251解题报告
- linux下免秘钥登录
- HTTP协议和HTTPS协议详解
- 数据结构例程——从根节点到每个叶子节点的路径之逆
- libsvm中的dec_values以及分类结果评分问题
- Troubleshooting ‘DFS lock handle’ waits
- 抽象类_接口_内部类JAVA048-051
- Android4.x 如何处理Power按键
- 浅说机器学习中“迭代法”
- 2015长春现场赛感想
- android SQLite存储简单范例+详细注释(增删查改)
- mongodb3.x认证