給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
_______3______
/ \
___5__ ___1__
/ \ / \
6 _2 0 8
/ \
7 4
示例 1:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點3。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點5 和節點4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。
說明:
通過對題目的分析,我們發現,如果兩個節點是乙個在左,乙個在右,最近祖先就是root,如果不是一左一右,依舊是遞迴子問題,兩個都是左,就去左子樹裡面找,兩個都在右,就去右子樹裡面去找。
struct treenode ;
bool findnode(struct treenode* root,struct treenode* node)
if(root==node)
return findnode(root->left,node)
|| findnode(root->right,node);
}struct treenode* lowestcommonancestor(struct treenode* root, struct treenode* p, struct treenode* q)
if(root==p||root==q)
bool pinleft,pinright,qinleft,qinright;
if(findnode(root->left,p))
else
if(findnode(root->left,q))
else
if(pinleft&&qinleft)
else if(pinright&&qinright)
else
}
上面**使用遞迴時,時間複雜度為o(n^2),下面**利用棧,把時間複雜度優化到o(n),具體**如下:
struct treenode ;
typedef struct treenode* stdatatype;
typedef struct stack
stack;
void stackinit(stack* ps, int n)
void stackdestroy(stack* ps)
void stackpush(stack* ps, stdatatype x)//在棧頂入資料
ps->_a[ps->_top] = x;
ps->_top++;
}void stackpop(stack* ps)//在棧頂出資料
}stdatatype stacktop(stack* ps)//取出棧頂的資料
int stacksize(stack* ps)//返回資料個數
int stackempty(stack* ps)
else }
void find(stack* st, struct treenode* root, struct treenode* p)
else//遍歷左路節點,找p的路徑
}//訪問右路節點
struct treenode* top = stacktop(st);
if(top->right == null|| top->right==prev)
else
cur = top->right;
}}struct treenode* lowestcommonancestor(struct treenode* root, struct treenode* p, struct treenode* q)
else
}
return top;
}
資料結構 考研 二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。解題思路 對這棵樹 t 左右子樹分別向下遍歷,如果乙個結點反饋回來的資訊表明分別在左右子樹中,則返回這個結點。如果只有乙個結點返回,那這個結點就是最近公共祖先。treenode lowestcommonancestor treenode root...
二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 思路 剛開始使用boolean來判斷要查詢的兩節點在左右孩子上,後面修改為使用treenode與null判斷兩節點位置 1 分別向左孩子和右孩子遞迴。2 若當...
二叉樹的最近公共祖先
輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 4 輸出 5 法1 分別找出根節點到兩個節點的路徑,則最後乙個公共節點就是最低公共祖先。法2 public treen...