【問題描述】假設二叉樹採用二叉鍊錶方式儲存,root指向根結點,p所指結點和q所指結點為二叉樹中的兩個不同結點,且互不成為根到該結點的路徑上的點,程式設計求解距離它們最近的共同祖先。
【輸入形式】二叉樹的前序和中序遍歷序列,用以建立該二叉樹的鏈式儲存結構;以及二叉樹的兩個結點資料 x 和 y
【輸出形式】結點資料值為 x 和結點資料值為 y 的最近的共同祖先,若沒有共同祖先則輸出null
【樣例輸入】
gabdcef
bdaefcg
df【樣例輸出】
a
12019/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...