求二叉樹中節點的最大距離

來源:互聯網
上載者:User

《編程之美》給出了一種方法,但是它要為每個節點都儲存一個最長左子樹距離和最長右子樹距離的欄位。

我想到了另一種方法,就是為節點編碼,根節點設為0,對於一個節點的左節點,它的編碼是它的父親節點的碼後面加個0,對於一個節點的右節點,它的編碼是它的父親節點的碼後面加個1,如果我們找到了葉子節點,就把為它編的碼存在一個數組中。一次遍曆完畢後,數組中就存在所有葉子節點的編碼了,再將根節點的碼也存在數組中。我們可以根據節點的碼來求出兩個節點間的距離。因為最大距離的兩個節點一定是葉子節點或者葉子節點和根節點,因此只需比較存在數組中的碼間的距離,就可以獲得最大距離了。

 

汗,怎麼每次說思路都說的糊裡糊塗的。。。其實,只要畫副圖就明確了,自己畫吧。。。

 

#include <iostream><br />#include <vector><br />#include <string><br />using namespace std;</p><p>template <class T><br />struct BTNode<br />{<br />T data;<br />BTNode<T> * left;<br />BTNode<T> * right;<br />BTNode(T i=0,BTNode<T> *l=NULL,BTNode<T> *r=NULL):data(i),left(l),right(r){};<br />};</p><p>vector<string> code;</p><p>//為葉子節點編碼,編號的碼儲存數組code中。</p><p>template <class T><br />void Code(BTNode<T> *p,string s)<br />{<br />if(p==NULL)<br />return;<br />if(p->left!=NULL)<br />Code(p->left,s+"0");<br />if(p->right!=NULL)<br />Code(p->right,s+"1");<br />if(p->left==NULL && p->right==NULL) //葉子節點<br />code.push_back(s);<br />}</p><p>template <class T><br />int maxdistance(BTNode<T> *root)<br />{<br />if(root==NULL)<br />return 0;<br />code.push_back("0");<br />Code(root,"0"); //編碼<br />int max=0;<br />int i,j;<br />string s1,s2;<br />for(i=0;i<code.size();i++)<br />{<br />for(j=i;j<code.size();j++)<br />{<br />s1=code[i];<br />s2=code[j];<br />int k=0;<br />while(k<s1.length() && k<s2.length() && s1.at(k)==s2.at(k)) //根據編的碼,計算距離。<br />k++;<br />int temp=((s1.length()-k)+(s2.length()-k));<br />if(temp>max)<br />max=temp;<br />}<br />}</p><p>return max;<br />}</p><p>int main()<br />{<br />BTNode<char> *h=new BTNode<char>('h'); //注意用模板,注意new<br />BTNode<char> *i=new BTNode<char>('i');<br />BTNode<char> *d=new BTNode<char>('d',h);<br />BTNode<char> *e=new BTNode<char>('e');<br />BTNode<char> *b=new BTNode<char>('b',d,e);<br />BTNode<char> *f=new BTNode<char>('f',NULL,i);<br />BTNode<char> *g=new BTNode<char>('g');<br />BTNode<char> *c=new BTNode<char>('c',f,g);<br />BTNode<char> *a=new BTNode<char>('a',b,c);</p><p>cout << maxdistance(a) << endl;<br />while(1);<br />return 0;<br />}

 

附上《編程之美》中的另一種解法

 

#include <iostream><br />using namespace std;</p><p>#define max(a,b) ((a)>(b)?(a):(b))</p><p>struct node<br />{<br />node *left;<br />node *right;<br />int nMaxLeft; //左子樹中的最長距離<br />int nMaxRight; //右子樹中的最長距離<br />char chValue;<br />node(char a,node *l=NULL,node *r=NULL):chValue(a),left(l),right(r){}<br />};</p><p>int nMaxLen=0;</p><p>void FindMaxLen(node *root)<br />{<br />if(root==NULL)<br />return;<br />if(root->left==NULL)<br />root->nMaxLeft=0;<br />if(root->right==NULL)<br />root->nMaxRight=0;<br />if(root->left!=NULL)<br />FindMaxLen(root->left);<br />if(root->right!=NULL)<br />FindMaxLen(root->right);<br />if(root->left!=NULL)<br />root->nMaxLeft=max(root->left->nMaxLeft,root->left->nMaxRight)+1;<br />if(root->right!=NULL)<br />root->nMaxRight=max(root->right->nMaxLeft,root->right->nMaxRight)+1;<br />if(root->nMaxLeft+root->nMaxRight>nMaxLen)<br />nMaxLen=root->nMaxLeft+root->nMaxRight;<br />}</p><p>int main()<br />{<br />node *h=new node('h');<br />node *i=new node('i');<br />node *e=new node('e',h);<br />node *c=new node('c',e);<br />node *f=new node('f',NULL,i);<br />node *g=new node('g');<br />node *d=new node('d',f,g);<br />node *b=new node('b',c,d);<br />node *a=new node('a',NULL,b);</p><p>FindMaxLen(a);<br />cout << nMaxLen << endl;<br />while(1);<br />}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.