演算法實現 在二叉樹中找到兩個節點的最近公共祖先

2021-10-05 03:03:20 字數 3499 閱讀 5718

該題目來自一次面試。。。

/*在二叉樹中找到兩個節點的最近公共祖先(高階)

給定一棵二叉樹,多次給出這棵樹上的兩個節點 o1 和 o2,請對於每次詢問,找到 o1 和 o2 的最近公共祖先節點。

輸入描述

第一行輸入兩個整數 n 和 root,n 表示二叉樹的總節點個數,root 表示二叉樹的根節點。

以下 n 行每行三個整數 fa,lch,rch,表示 fa 的左兒子為 lch,右兒子為 rch。(如果 lch 為 0 則表示 fa 沒有左兒子,rch同理)

第 n+2 行輸入乙個整數 m,表示詢問的次數。

以下 m 行每行兩個節點 o1 和 o2。

輸出描述

對於每組詢問每行輸出乙個整數表示答案。

示例1輸入

8 11 2 3

2 4 5

4 0 0

5 0 0

3 6 7

6 0 0

7 8 0

8 0 0

44 5

5 26 8

5 8輸出

22    這裡貌似有錯誤,2,5的共同祖先應該是 131

*/#include

#include

#include

#include

#include

#include

using namespace std;

templatestruct binarytreenode

~binarytreenode()

};template using node = binarytreenode;

templateclass binarytree

node* createbinarytree(int32_t maxnodes,const t &rootdata);

node* addbinarytreenode(const t &parent,const t &lch,const t &rch);

node* find(node*root,const t &x);

void getpath(const t &x,std::vector&v);

const std::tuplegetpublicancestor(const t &o1,std::vector&v);        

const std::tuplegetpublicancestor(const t &o1,const t &o2);

void prevorderoutput(const node*root,std::vector&v);

};templatenode* binarytree::createbinarytree(int32_t maxnodes,const t &rootdata)

templatenode* binarytree::addbinarytreenode(const t &parent,const t &lch,const t &rch)

if(_currentnodes >= _maxnodes)

//找到父節點

node* p = find(this->_root,parent);

if(p == nullptr)

//update or add left node

if(p->lch == nullptr)

}else

//update or add right node

if(p->rch == nullptr)

}else

return p;

}templatenode* binarytree::find(node*root,const t &x)  

node* target = nullptr; 

node* cur = root;   

if (cur->_fa == x)  

else  

}  return target;

}templatevoid binarytree::getpath(const t &x,std::vector&v)

}templateconst std::tuplebinarytree::getpublicancestor(const t &o1,const t &o2)

}t value;

return std::make_tuple(false,value);

}//通過傳入第乙個節點列表, 再查詢遍歷過程中判斷,感覺介面侵入性太強

templateconst std::tuplebinarytree::getpublicancestor(const t &o1,std::vector&v)

templatevoid binarytree::prevorderoutput(const node*root,std::vector&v)

}void testgetpath(int32_t node,binarytree&bt)

);std::cout<

void testgetpublicancestor(int32_t o1,int32_t o2,binarytree&bt)

{std::tupleancestor = bt.getpublicancestor(o1,o2);

if(std::get<0>(ancestor))

{std::cout<< o1 << "," << o2 << " ancestor is :" << std::get<1>(ancestor) <

// g++ binary_tree.cpp -g -o binary_tree

// centos linux release 8.1.1911 (core) 

// gcc (gcc) 8.3.1 20190507 (red hat 8.3.1-4)

int32_t main(int32_t argc, char *ar**)

{//構建二叉樹

/**********************************

12           3

4     5     6      7 

8***********************************/ 

binarytreebt;

node*root = bt.createbinarytree(8,1);

bt.addbinarytreenode(1,2,3);

bt.addbinarytreenode(2,4,5);

bt.addbinarytreenode(4,0,0);

bt.addbinarytreenode(5,0,0);

bt.addbinarytreenode(3,6,7);

bt.addbinarytreenode(6,0,0);

bt.addbinarytreenode(7,8,0);

bt.addbinarytreenode(8,0,0);

//驗證樹結構

std::vectorv;

bt.prevorderoutput(root,v);

for(auto e : v)

{std::cout<

樹 在二叉樹中找到兩個節點的最低公共祖先LCA

首先利用自底向上的思路 如果遍歷到當前節點是a b中的任意乙個,則向父節點匯報此節點,否則遞迴到節點為null時返回null值。具體情況如下幾種 1.當前節點即為兩個節點中的乙個,此時直接向父節點返回當前節點 2.遞迴到null,返回null 3.當前節點不是兩個節點中的乙個,此時判斷左右子樹的返回...

在二叉樹中找到兩個節點的最近公共祖先 I

給定一棵二叉樹的頭節點 head,以及這棵樹中的兩個節點 o1 和 o2,請返回 o1 和 o2 的最 近公共祖先節點。說明 o1和o2要麼同時都在二叉樹上,要麼同時都不在二叉樹上。後序遍歷二叉樹,假設遍歷到的當前節點為 cur。因為是後序遍歷,所以 先處理 cur 的兩棵子樹。假設處理 cur 左...

在二叉樹中找到兩個節點的最近公共祖先 高階

在二叉樹中找到兩個節點的最近公共祖先 高階 給定一棵二叉樹,多次給出這棵樹上的兩個節點 o1 和 o2,請對於每次詢問,找到 o1 和 o2 的最近公共祖先節點。輸入描述 第一行輸入兩個整數 n 和 root,n 表示二叉樹的總節點個數,root 表示二叉樹的根節點。以下 n 行每行三個整數 fa,...