二叉樹結點的共同祖先問題

2022-06-03 19:06:10 字數 1656 閱讀 8899

【問題描述】假設二叉樹採用二叉鍊錶方式儲存,root指向根結點,p所指結點和q所指結點為二叉樹中的兩個不同結點,且互不成為根到該結點的路徑上的點,程式設計求解距離它們最近的共同祖先。

【輸入形式】二叉樹的前序和中序遍歷序列,用以建立該二叉樹的鏈式儲存結構;以及二叉樹的兩個結點資料 x 和 y

【輸出形式】結點資料值為 x 和結點資料值為 y 的最近的共同祖先,若沒有共同祖先則輸出null

【樣例輸入】

gabdcef

bdaefcg

df【樣例輸出】

a

1

2019/6/10

22:37:28

2 #include3

using

namespace

std;

4#define n 20

5 typedef struct

treebitnode , *bitree;

11 bitree only(char *pre,char *in,int length) //

哇哦 這句話真是重中之重

17for(index=0;index)

21 } //

到了中序序列第幾號元素:index==根節點==前序序列第乙個元素

2223

//遞迴 開始找根節點的左子樹------的根節點

24 root->leftchild=only(pre+1,in

,index);

25//

遞迴 開始找根節點的右子樹-------的根節點

26 root->rightchild=only(pre+1+index,in+index+1,length-index-1

);27

return

root;28}

2930

bool cover(bitree root,char

pt)33

if(root->data==pt)else38}

39 bitree searchcommen(bitree node,char pt1, char

pt2) //

沒有找到或者node壓根就是個空的 返回null;

43if(node->data==pt1||node->data==pt2)//

乙個元素和根節點元素撞了,另乙個是子元素,二者沒有共同祖先

4445

//兩個元素都是正常的子節點的元素

46//

先在根節點的左子樹裡面找兩個元素

47bool t1=cover(node->leftchild,pt1);//

leftchild pt1

48bool t2=cover(node->leftchild,pt2);//

leftchild pt2

4950

if(t1!=t2) //

兩個元素 乙個在左邊找到了 乙個沒找到 證明一左一右 所以祖先就是node

51else

54//

t1=t2 如果都等於no 證明沒有在左子樹找到,那麼就一定在右子樹

55if(t2==true) 56}

57}5859

intmain()

80else

81 }

二叉樹最近共同祖先

從鍵盤接收擴充套件先序序列,以二叉鍊錶作為儲存結構,建立二叉樹。求兩個不同結點ch1,ch2的最近共同祖先。第一行 擴充套件先序序列 第二行 ch1,ch2兩個不同結點值,用乙個空格間隔。abc de g f c fb include include include typedef struct n...

二叉搜尋樹 共同祖先問題

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

二叉樹中找到兩結點的共同祖先(遞迴)

從根節點往左右子樹遍歷過程中,對於乙個最近共同祖先的情況如下 兩結點存在的情況下 1 當前結點就是兩結點之一,另乙個在當前結點的子樹上。2 乙個在左 乙個在右。可以考慮遞迴 res存放結果 bool findanc bittree bt,bittree p,bittree q,bittree res...