版权声明:本文纯属作者口胡,欢迎转载 https://blog.csdn.net/TQCAI666/article/details/81461708
二叉树中根节点
到所有值为x的结点
的路径
void search_path(BTNode* p,int x){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
if(p->data==x){//找到目标结点
cout<<"path: ";
for(int i=0;i<=top;i++) visit(S[i]);
cout<<";"<<endl;
// exit(0); 加上这个语句就是只找一个
}
p=p->lchild;
}
while(top>=0 && S[top]->tag==1){ //访问标记
// visit(S[top]);
top--;
}
if(top>=0){
S[top]->tag=1; //标记栈顶
p=S[top]->rchild; //转右子树
}
}
}
完整代码:
#include <bits/stdc++.h>
#define LEN 100
using namespace std;
typedef struct BTNode{
int data;
int tag=0;
BTNode * lchild=NULL;
BTNode * rchild=NULL;
BTNode(int d):data(d){
}
}BTNode;
BTNode* create_demo_tree(){
BTNode* rt=new BTNode(1);
BTNode* rt_l=rt->lchild=new BTNode(2);
BTNode* rt_r=rt->rchild=new BTNode(4);
rt_l->lchild=new BTNode(3);
rt_l->rchild=new BTNode(5);
rt_r->rchild=new BTNode(5);
return rt;
}
int visit(BTNode* p){
cout<<p->data<<' ';
}
int in_order(BTNode* p){
if(p){
in_order(p->lchild);
visit(p);
in_order(p->rchild);
}
}
void pre_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
S[++top] = p; //根节点入栈
while(top>=0){
BTNode* node=S[top--];
visit(node);
if(node->rchild)
S[++top] = node->rchild;
if(node->lchild)
S[++top] = node->lchild;
}
}
void in_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
// S[++top] = p; //不需要根节点入栈
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){ //出栈置右
p=S[top--];
visit(p);
p=p->rchild;
}
}
}
void post_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){
p=S[top]; //查看栈顶结点
if(p->rchild && p->rchild!=r){ //右存未访
p=p->rchild; //压右入左
S[++top]=p;
p=p->lchild;
}else{
p=S[top--]; //否则出栈
visit(p);
r=p;
p=NULL;
}
}
}
}
void post_order_norRecursion_2(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
while(top>=0 && S[top]->tag==1){ //访问标记
visit(S[top]);
top--;
}
if(top>=0){
S[top]->tag=1; //标记栈顶
p=S[top]->rchild; //转右子树
}
}
}
void search_path(BTNode* p,int x){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
if(p->data==x){//找到目标结点
cout<<"path: ";
for(int i=0;i<=top;i++) visit(S[i]);
cout<<";"<<endl;
// exit(0); 加上这个语句就是只找一个
}
p=p->lchild;
}
while(top>=0 && S[top]->tag==1){ //访问标记
// visit(S[top]);
top--;
}
if(top>=0){
S[top]->tag=1; //标记栈顶
p=S[top]->rchild; //转右子树
}
}
}
int main(){
BTNode* root=create_demo_tree();
// in_order(root);
search_path(root,5);
return 0;
}