LEETCODE236. 二叉树的最近公共祖先
1. 二叉树后序遍历算法(LRN),通过该算法最后访问根节点等特性,能找到根节点到二叉树中特定结点的路径,或者说能找到二叉树中特定结点的所有祖先。
2. 方法:在二叉树后序非递归遍历过程中,进左子树不说,进入右子树由于根结点不出栈,所以可以通过栈获取路径。访问到目标结点(后序非递归会有两次访问root,注意区分),此时栈中存放的元素即为从当前结点到根节点的路径。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//对于上图4,则打印2 5 3
typedef struct TreeNode* Tree;
typedef struct{
Tree* array;
int top;
}Stack;
struct TreeNode* getAncestor(struct TreeNode* root, struct TreeNode* p) {
Stack* s=(Stack *)malloc(sizeof(Stack));
s->array=(Tree *)malloc(100*sizeof(Tree));
s->top=0;
Tree t=NULL; //最近访问节点
while(root||s->top){
if(root){
s->array[s->top++]=root;
root=root->left;
}
else{
root=s->array[s->top-1];
if(root->right&&root->right!=t){
root=root->right;
}
else{ //真正访问到节点
root=s->array[--s->top];
if(root==p){ //找到
while(s->top){ //打印出栈中元素
printf("%d ",s->array[--s->top]->val);
}
}
t=root;
root=NULL;
}
}
}
return p;
}