wustoj(二叉树根节点到指定结点的路径-非递归算法)
2017-11-18 11:47
1581 查看
问题描述:
二叉树采用二叉链表存储结构进行存储,需要输出从二叉树的树根到指定结点的完整路径。按照给出的先序序列根据教材中算法6.4所示的算法建立二叉链表。二叉树中每个结点的数据都不相同。
Input
包含多组测试数据。
每组测试数据的第一行给出二叉树的先序遍历序列(结点数至少1个,不超过100个),用于建立二叉链表存储的二叉树。
第二行一个整数m,表示有m个结点需要输出从根节点到它自己的路径。
接下来m行,每行一个字符c,表示需要输出从根节点到本结点的路径。
Output
每组数据输出m行,每行为一个从根节点到对应结点之间的路径。
ABC^^DE^G^^F^^^
3
A
D
G
A
ABD
ABDEG
题目分析:二叉树上找路径(非递归算法),主要利用的是二叉树的后序遍历的非递归算法,点这里
后序遍历中,栈顶如果是对应的指定节点,那么这个栈就保存的是这条路径。
代码如下:
二叉树采用二叉链表存储结构进行存储,需要输出从二叉树的树根到指定结点的完整路径。按照给出的先序序列根据教材中算法6.4所示的算法建立二叉链表。二叉树中每个结点的数据都不相同。
Input
包含多组测试数据。
每组测试数据的第一行给出二叉树的先序遍历序列(结点数至少1个,不超过100个),用于建立二叉链表存储的二叉树。
第二行一个整数m,表示有m个结点需要输出从根节点到它自己的路径。
接下来m行,每行一个字符c,表示需要输出从根节点到本结点的路径。
Output
每组数据输出m行,每行为一个从根节点到对应结点之间的路径。
ABC^^DE^G^^F^^^
3
A
D
G
A
ABD
ABDEG
题目分析:二叉树上找路径(非递归算法),主要利用的是二叉树的后序遍历的非递归算法,点这里
后序遍历中,栈顶如果是对应的指定节点,那么这个栈就保存的是这条路径。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<stack> #include<string> using namespace std; string str; int cur,len,n; char e; struct tree { char val; struct tree* lchild,*rchild; bool flag; }*Tree; stack<struct tree*> s,ans; void build(struct tree* &T) { if (cur>=len) return ; if (str[cur]=='^') { T=NULL;; cur++; return ; } else { T=new struct tree(); T->val=str[cur]; cur++; build(T->lchild); build(T->rchild); } } void postorder(struct tree* T) { if (T==NULL) return ; struct tree* p=T; while (p!=NULL) { p->flag=false; s.push(p); p=p->lchild; } while (s.size()) { struct tree* p=s.top(); if (p->flag==true||p->rchild==NULL) { if (p->val==e) return ; else { s.pop(); } } else { p->f 4000 lag=true; p=p->rchild; while (p!=NULL) { p->flag=false; s.push(p); p=p->lchild; } } } } int main() { while (cin>>str) { cin>>n; cur=0;len=str.size(); build(Tree); while (n--) { cin>>e; while (s.size()) s.pop(); postorder(Tree); while (s.size()) {//注意这条路径是倒着的 struct tree* p=s.top(); s.pop(); ans.push(p); } while (ans.size()) { struct tree* p=ans.top(); ans.pop(); cout<<p->val; } cout<<endl; } } return 0; }
相关文章推荐
- 二叉树根节点到指定节点的路径
- 二叉树怎么打印根节点到指定节点的路径及两个节点之间的路径
- 二叉树的层次,中序非递归遍历,以递归前序的方式构造二叉树,将二叉树中的e更新为d,输出从根结点出发 到指定结点,依次经过的祖先(即路径),由前序和中序还原二叉树
- 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。
- 面试经典(16)--二叉树根节点到指定节点的路径
- 5)二叉树[3]求所有结点到根节点的路径
- 打印从根节点到二叉树中指定值节点的路径
- java--数据结构--二叉树根节点到指定节点的路径
- 求二叉树中结点值的和为指定整数的所有路径
- 查找二叉树的指定节点及根节点到该节点的路径
- 二叉树中根结点到某节点的路径(求某结点的所有祖先)
- 找出二叉树中指定结点的下一个结点(中序后继)可以假定每个结点都有指向父节点的连接
- 给定一棵二叉树,找到它的最小深度。最小深度是从根节点到最近叶节点的最短路径上的节点数量
- 剑指offer 打印出二叉树中结点值的和为输入整数的所有路径。
- 寻找二叉树某节点的路径
- 求二叉树中的第一条最长路径长度,并输出最长路径上的节点
- POJ 2499 求二叉树结点到根结点的路径长度 递归 二叉树
- 有一个二叉树,现在怀疑它有一个结点有2个父节点,请写出一个函数来判断该二叉树是否存在一个节点含有2个父节点。如果存在,返回true,否则返回false。
- 二叉树中找寻 节点和 为某个值的路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。