本週學習了樹和二叉樹這一結構,對於以前的結構來講,我以爲難了不少,首先這個結構有孩子結點,兄弟結點,雙親結點等, 首先從建立樹的結構來講就複雜了不少,在對樹的不少操做中用到了不少遞歸的算法,這對於原本以前遞歸算法就不太理解的我來講挺難的,並且一旦程序寫錯了,遞歸算法很不容易發現錯誤,因此在寫樹的相關程序的時候,最重要的我以爲仍是整個思路的問題,有些遞歸算法不太容易想出來,而一旦想出來問題就變得簡單不少了。ios
二叉樹有先序,中序,後序遍歷等遍歷樹的方法,其中還有相關的轉換,這個問題感受很難,理解三種的轉化還挺容易,可是代碼的實現特別難寫...感受要看好多好多遍才能記住...總結就是這章的知識點挺多的c++
void InitExpTree(BTree &T,string str) //建表達式的二叉樹 { 定義一個棧s存放數字 定義一個棧op 存放運算符 ‘#’進op棧; while遍歷str 給樹結點賦值 { If str[i]爲數字 { 新建樹結點T=new BiTNode; T->data=str[i++];T的左右孩子都置爲空 T入s棧; } else是運算符 { switch調用precede函數比較op棧頂和str[i] { case'<':str[i++]入棧op case'=':op棧出棧 case'>': 新建結點T,T->data=op.top() T->rchild=s.top();s棧出棧 T->lchild=s.top();s棧出棧 新建的T結點入s棧 op棧出棧 } } while(op棧頂元素不是'#') //把樹結點的關係連起來 { 新建結點T; T->data=op.top();op棧出棧 T->rchild=s.top(); s棧出棧 T->lchild=s.top();s棧出棧 T結點進s棧 } } double EvaluateExTree(BTree T)計算表達式樹 { 定義a,b if 樹T不空 if 左右孩子都爲空 return T->data-'0'; a=EvaluateExTree(T->lchild) b=EvaluateExTree(T->rchild) switch T->data case'+':return a+b case'-':rerurn a-b case'*':return a*b case '/': if b==0 輸出divide 0 error! else return a/b }
#include<iostream> #include<stdio.h> #include<string> using namespace std; 定義字符型數組 str1[110],str2[110]; int main() { int n; 輸入結點個數n; 輸出str1 str2; 輸出二叉樹高度 return 0; } int dfs(char a[],char b[],int m) { if m==0 return 0;//沒有節點,爲空樹 end if int i; for i=0 to i<m { if b[i]==a[0] //找到根節點在中序的位置 break; } end for int c=dfs(a+1,b,i)+1;//左子樹的深度 int d=dfs(a+i+1,b+i+1,m-i-1)+1;//右子樹的深度 int h; if c>d h=c++; else h=d++; return h; }
main函數和建樹函數CreatTree(string str, int &i) void LevelOrder(BinTree BT) //層次遍歷 { 定義BinTree型隊列qt; int level,flag; 定義BinTree結構體curNode,lastNode; curNode=lastNode=BT; if BT==NULL 輸出NULL return ; else BT進隊 while(隊qt不爲空) { if curNode==lastNode { level++; 用flag控制換行 lastNode=qt.back(); } end if curNode=qt.front(); 輸出curNode->Data if curNode->Left不爲空 curNode->Left進隊qt if curNode->Right非空 curNode->Right進隊qt qt隊出隊 } }
給定一棵二叉樹,返回全部重複的子樹。對於同一類的重複子樹,你只須要返回其中任意一棵的根結點便可。
兩棵樹重複是指它們具備相同的結構以及相同的結點值
下面是兩個重複的子樹:
算法
經過map記錄每顆子樹先序遍歷或者後序遍歷的結果, 找到全部遍歷結果相同的子樹。數組