資料結構 求二叉樹的最近公共祖先

2021-08-30 02:30:42 字數 2215 閱讀 6277

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉樹:  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...