leetcode 236 二叉樹的最近公共祖先

2021-09-25 06:35:13 字數 1549 閱讀 2683

1.題目:

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

示例 :

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 6, q = 4

輸出: 5

2.**:法1:

/**

* definition for a binary tree node.

* struct treenode ;

*/ /*

後序非遞迴遍歷中,訪問到該結點時,棧中存放的是該結點到根結點的路徑,即該結點從下到上的所有祖先結點。

假設先訪問到p,將棧中結點暫存stack2,stack2存放的是p的所有祖先。之後訪問到q,此時stack中存放的是q所有

祖先,從棧頂開始比較,找出最近公共祖先。

ps:兩個棧長不一樣,將stack中元素依次與stack中比較。

*/typedef struct treenode* tree;

typedef structstack;

struct treenode* lowestcommonancestor(struct treenode* root, struct treenode* p, struct treenode* q)

else

else

else if((root==p||root==q)&&flag==1)

}t=root;

root=null;

} }}

return null;

}

法2:

/**

* definition for a binary tree node.

* struct treenode ;

*/ /*

後序遍歷求4、6最近公共祖先:

1. 1(2)

2. (2)/ \(n)

2 3

3. (4)/ \(6) (n)/ \(n)

4 5 n 7

4. / \ (n)/ \(6) (n)/ \(n)

n n n 6 n n

*/struct treenode* lowestcommonancestor(struct treenode* root, struct treenode* p, struct treenode* q)

3.知識點:

後序遍歷遞迴、後序遍歷獲取結點路徑

LeetCode236 二叉樹最近祖先

思考 這個函式就是查詢p,q兩個節點的祖先,然後給了這棵樹的root,1 它先進行判斷,根節點是不是null 或者根節點是否是p q,要是有乙個是,那祖先就肯定是root 2 它用了遞迴的思想去查詢左右兩個子樹,因為pq的祖先要麼在左邊,要麼就在右邊,所以肯定能找到乙個祖先。3 若找到的left 子...

LeetCode 236 二叉樹最近公共祖先

leetcode 236 二叉樹最近公共祖先 236.二叉樹的最近公共祖先 題目描述 給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。解體思路 分兩部分解決 第一部分 實現判斷兩個結點包含於某根節點的子樹內 第二部分 先序遍歷二叉樹,如果根節點的子樹包含qp目標結點 傳入左孩子,進行遞迴。傳入...

leetcode 236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...