該題目來自一次面試。。。
/*在二叉樹中找到兩個節點的最近公共祖先(高階)
給定一棵二叉樹,多次給出這棵樹上的兩個節點 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,...