2017山东大学909

//
// 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;
}

猜你喜欢

转载自blog.csdn.net/sir_ti/article/details/80628027