//
// 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
最新推荐文章于 2022-09-12 15:00:35 发布