7 14 二叉搜尋樹的最近公共祖先 (30 分

2021-09-13 19:44:10 字數 1824 閱讀 4883

給定一棵二叉搜尋樹的先序遍歷序列,要求你找出任意兩結點的最近公共祖先結點(簡稱 lca)。

輸入的第一行給出兩個正整數:待查詢的結點對數 m(≤ 1 000)和二叉搜尋樹中結點個數 n(≤ 10 000)。隨後一行給出 n 個不同的整數,為二叉搜尋樹的先序遍歷序列。最後 m 行,每行給出一對整數鍵值 u 和 v。所有鍵值都在整型int範圍內。

對每一對給定的 u 和 v,如果找到a是它們的最近公共祖先結點的鍵值,則在一行中輸出lca of u and v is a.。但如果 u 和 v 中的乙個結點是另乙個結點的祖先,則在一行中輸出x is an ancestor of y.,其中x是那個祖先結點的鍵值,y是另乙個鍵值。如果 二叉搜尋樹中找不到以 u 或 v 為鍵值的結點,則輸出error: u is not found.或者error: v is not found.,或者error: u and v are not found.

6 8

6 3 1 2 5 4 8 7

2 58 7

1 912 -3

0 899 99

lca of 2 and 5 is 3.

8 is an ancestor of 7.

error: 9 is not found.

error: 12 and -3 are not found.

error: 0 is not found.

error: 99 and 99 are not found.

題解:先用map標記該節點是否在樹上,然後先判斷是否有祖先關係,然後再找lca(找到乙個節點u的位址,往上找father看其子節點是否有另乙個節點v ,如果找到則返回節點值(一定會找到的,最壞是根節點麼~~)

#includeusing namespace std;

struct node

;int a[10001];

mapmp;

node *create(int l,int r)

root->l=create(l+1,i-1);

if(root->l)//要特判是否為空

root->l->f=root;//標記father節點

root->r=create(i,r);

if(root->r)

root->r->f=root;

return root;

}int find(node *root,int x)//在以root為根的子樹中是否查詢到x

return 0;

}int find_f(node *root,int u,int v)//u是否是v的祖先

if(udata)

return find_f(root->l,u,v);

else

return find_f(root->r,u,v);

}return 0;

}int find_lca(node *root,int x)//從第乙個節點的位址向上找第二個節點的祖先

return 0;

}node *find_pos(node *root,int x)//找到乙個節點的位置,返回的是乙個指標

return null;

}int main()

root=create(1,m);

for(int i=1; i<=n; i++)}}

return 0;

}

二叉搜尋樹的最近公共祖先

給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 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 的最近公共祖先...

二叉搜尋樹的最近公共祖先

給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 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 的最近公共祖先...

二叉搜尋樹的最近公共祖先

例如,給定如下二叉搜尋樹 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 的最近公共祖先是 6。示例 2 輸入 root 6,2,8,0,4,7,...