二叉樹中兩個結點的距離

問題
對於普通的二叉樹,如何找到兩個給定節點之間的距離?距離是指鏈接兩個節點所須要的最小邊的條數。
例以下面的二叉樹:
這個問題很全面的考察了二叉樹的相關的知識,建議你們先嚐試本身解決
分析:
假設給定的節點爲node1,node2,能夠分爲下面的兩種狀況:
1)node1是node2的祖先節點或孩子結點,能夠理解爲兩個節點在一條線上。例如:Dist(2,4),Dist(6,1)
2)node1和node2沒有直接或間接的父子關係。例如,Dist(4,3),他們須要一個共同的祖先結點1鏈接起來
假設lca是兩個節點的最低公共祖先節點:
Dist(n1,n2)=Dist(root,n1)+Dist(root,n2)-2*Dist(root,lca)
這個公式已經涵蓋了上面的兩種狀況。先找出lca,再求root節點到某個節點的距離就比較簡單了。
參考代碼:
 1 #include<list>
 2 #include<vector>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 
 9 struct BinaryTreeNode//二叉樹結點類型
10 {
11     char value;
12     BinaryTreeNode* left;
13     BinaryTreeNode* right;
14 };
15 
16 void CreatBinaryTree(BinaryTreeNode** pRoot)//建立二叉樹
17 {
18     char data;
19     cin>>data;
20     if(data!='.')
21     {
22         *pRoot=new BinaryTreeNode;
23         (*pRoot)->value=data;
24         CreatBinaryTree(&((*pRoot)->left));//建立左子樹
25         CreatBinaryTree(&((*pRoot)->right));//建立右子樹
26     }
27     else *pRoot=NULL;
28 }
29 
30 
31 
32 bool GetNodePath(BinaryTreeNode* pRoot,char pNode,list<BinaryTreeNode*> &path)//得到結點路徑
33 {
34     bool found=false;
35     path.push_back(pRoot);
36     if(pRoot->value==pNode) return true;
37     if(!found&&pRoot->left!=NULL)
38     {
39         found=GetNodePath(pRoot->left,pNode,path);
40     }
41     if(!found&&pRoot->right!=NULL)
42     {
43      found=GetNodePath(pRoot->right,pNode,path);
44     }
45     if(!found)
46     path.pop_back();
47     return found;
48 }
49 char GetLastCommonNode(list<BinaryTreeNode*> &path1,list<BinaryTreeNode*> &path2)//得到最近相同根結點的值
50 {
51     list<BinaryTreeNode*>::iterator ite1=path1.begin();
52     list<BinaryTreeNode*>::iterator ite2=path2.begin();
53     BinaryTreeNode* pLast;
54     while(ite1!=path1.end()&&ite2!=path2.end())
55     {
56         if(*ite1==*ite2)
57             pLast=*ite1;
58         ite1++;
59         ite2++;
60     }
61     return pLast->value;
62 }
63 
64 void print(list<BinaryTreeNode*> &path)//打印路徑
65 {
66     list<BinaryTreeNode*>::iterator ite;
67     for(ite=path.begin();ite!=path.end();++ite)
68     {cout<<(*ite)->value<<' ';}
69     cout<<endl;
70 }
71 
72 
73 void main()
74 {
75     BinaryTreeNode* pRoot;
76     CreatBinaryTree(&pRoot);
77     list<BinaryTreeNode*> path1,path2,path3;
78     cout<<"請輸入結點字符:"<<endl;
79     char s1,s2;
80     cin>>s1>>s2;
81     GetNodePath( pRoot,s1,path1);
82     GetNodePath( pRoot,s2,path2);
83     char common=GetLastCommonNode(path1,path2);
84     GetNodePath( pRoot,common,path3);
85     print(path1);
86     print(path2);
87     print(path3);
88     int distance=path1.size()+path2.size()-2*path3.size();
89     cout<<s1<<" with "<<s2<<" distance is: "<<distance<<endl;
90 }

相關文章
相關標籤/搜索