1297 树中节点的祖先
-
描述: PIPI有一棵结点值均不相同的二叉树,现在他想知道某结点的祖先结点有哪些,你能帮PIPI解决这个问题吗?
-
输入:第一行按照先序输入一棵二叉树,其中空节点用 -1 表示。
第二行输入待查询结点的值。 -
输出:输出一行,代表该结点的祖先节点,从根节点开始输出。若树中无该结点,输出"No Node!"。若树中某结点无祖先,输出 “No Ancestor!”
-
输入示例
8 3 1 -1 -1 6 4 -1 -1 7 -1 -1 10 -1 14 13 -1 -1 -1 13
-
输出示例
8 10 14
-
代码块
#include<bits/stdc++.h> using namespace std; typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; BiTNode *BuildTree(){ int data; scanf("%d", &data); if(data == -1) return NULL; BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode)); p->data = data; p->lchild = BuildTree(); p->rchild = BuildTree(); return p; } void PostOrder(BiTree T, int data){ BiTNode *pre = NULL; BiTNode *p = T; BiTNode * st[999]; int top = -1; bool symbol = false; if(p == NULL || p->data == data){ printf("No Ancestor!"); return; } while(p || top != -1){ if(p){ st[++top] = p; p = p->lchild; }else{ p = st[top]; if(p->rchild != NULL && pre != p->rchild) p = p->rchild; else{ top--; if(data == p->data){ symbol = true; for(int i=0; i<=top; i++) printf("%d ", st[i]->data); } pre = p; p = NULL; } } } if(!symbol){ printf("No Node!"); return; } } // 错误的递归代码 // void PostOrder(BiTree T, int data, bool &symbol){ // if(T == NULL) return; // PostOrder(T->lchild, data, symbol); // PostOrder(T->rchild, data, symbol); // if(symbol == true) printf("%d ", T->data); // if(T->data == data) symbol = true; // } // void Judge(BiTree T, int data){ // if(T == NULL){ // printf("No Ancestor!\n"); // return; // } // bool symbol = false; // PostOrder(T, data, symbol); // if(!symbol) printf("No Node!\n"); // } int main(){ BiTree T = BuildTree(); int data; scanf(" %d", &data); PostOrder(T, data); // Judge(T, data); printf("\n"); system("pause"); return 0; }