// // Created by tao li on 2018/6/8. // #include <iostream> /**Description: 二叉树采用二叉链表进行存储,每个节点包括数据域Data,左孩子指针域left,右孩子指针域right。 * p所指的节点为任一给定节点,编写算法,求从根节点到p所指向的节点之间的路径,叙述算法思想并给出算法实现, * 分析时间复杂度。 */ /**算法思想:现在所考的题型一般都是树的遍历的变异,我们需要掌握树的递归遍历和非递归遍历,并分析他们之间的异同点。 * 在本题中,我们所需要解决的是路径问题,首先映入笔者脑海的是非递归后序遍历,借助于一个栈,一直遍历,直到找到节点p, * 此时栈中所有的元素即为根节点到p节点的路径。 * */ //树的节点定义 typedef struct BitNode{ int data; struct BitNode *left,*right; }*Bitree; //栈定义 typedef struct { Bitree t; int tag; }stack;//tag=0表示左孩子被访问,tag=1表示右孩子被访问 void search(Bitree bt,Bitree p){ stack s[]; int top=0; while(bt!=NULL||top>0){ while(bt!=NULL||bt!=p){ s[++top].t=bt; s[top].tag=0; bt=bt->left; } if(bt==p){ printf("所查节点的所有祖先节点的值为:\n"); for(int i=1;i<=top;i++) printf("%d",s[i].t->data); exit(1); } while (top!=0&&s[top].tag==1) top--; if(top!=0){ s[top].tag=1; bt=s[top].t->right; } } } //利用递归的思想去解答 bool printPath(BitNode *root,BitNode *p){ if(root==NULL) return false; if(root==p||printPath(root->left,p)||printPath(root->right,p)){ cout<<root->data; return true; } return false; }
2017山东大学909
猜你喜欢
转载自blog.csdn.net/sir_ti/article/details/80628027
今日推荐
周排行