基本術語
樹是n個結點的有限集合當n=0時稱爲空樹,任意一顆非空樹滿足以下條件
1.有且僅有一個特定的稱爲根的節點。
2.當n>1時除根結點之外的其餘節點被分成m個互不相交的有限集合T1,T2,。。。Tm;其中每個集合又是一棵樹並稱爲這個根節點的子樹。
結點的度·樹的度:某結點所擁有的子樹的個數稱爲該節點的度;樹中各節點的度的最大值稱爲該樹的度。
葉子節點分支節點:度爲0的結點稱爲葉子結點,也稱爲終端節點度不爲零的結點稱爲分支結點也稱爲非終端結點。
孩子雙親兄弟:某結點子樹的根節點稱爲該結點的孩子結點,反之稱爲該節點的雙親結點,具有同一個雙親的孩子結點互稱爲兄第結點。
路徑路徑長度:一個點到另一個節點的邊數成爲路徑長度這條路叫做路徑
祖先子孫:從x到y有一條路徑那麼x就稱爲y的祖先,y稱爲x的子孫
結點的層數樹的深度:根結點的層數爲1某結點在k層則子結點在k+1層,樹中所有結點的最大層數稱爲該樹的深度。
有序樹,無序樹:如果一棵樹中結點的各子樹從左到右是有次序的即如果交換了各子樹的相對位置則構成不同的樹這棵樹就是有序樹否則就是無序樹。
二叉樹就是每個節點的孩子最多有兩個的樹 而且可以通過先序和中序確定後序序列
#include<iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <string>
using namespace std;
string a,b;
void dfs(int l,int r ,int po){
if(po>=a.size())
return ;
char c=a[po];
if(l==r){
cout<<a[po];
return ;
}
if(l>r)
return;
int i;
for(i=l;i<=r;i++)
if(b[i]==c)
break;
dfs(l,i-1,po+1);
dfs(i+1,r,i-l+1+po);
cout<<c;
}
int main(){
while(cin>>a>>b){
dfs(0,b.size()-1,0);
cout<<endl;
}
return 0;
}
二叉鏈表
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
char c[9000];
struct Node{
char data;
Node *lson,*rson;
};
struct linkdou{
Node *first;
linkdou(){
first=new Node;
first=dfs();
}
Node* dfs(){
Node *x;
x=new Node;
x->lson=NULL;
x->rson=NULL;
char c;
cin>>c;
if(c=='#')
return NULL;
else
{
x->data=c;
x->lson=dfs();
x->rson=dfs();
}
return x;
}//這裏構造函數遞歸構造#代表已經沒有子樹了這樣才能返回先構造完子樹再把子樹的根節點作爲兒子返回
void qianxu(Node *x){
if(x!=NULL){
cout<<x->data;
qianxu(x->lson);
qianxu(x->rson);
}
}
void zianxu(Node *x){
if(x!=NULL){
zianxu(x->lson);
cout<<x->data;
zianxu(x->rson);
}
}
void hianxu(Node *x){
if(x!=NULL){
hianxu(x->lson);
hianxu(x->rson);
cout<<x->data;
}
}
};
順序存儲 設當前節點在數組中存儲的下表爲K 則左孩子就是2*K右孩子2*K+1;
二叉樹的遍歷
前序中序後序遍歷層次遍歷,層次遍歷需要隊列類似廣度優先搜索,前序中序後序指的是訪問根節點的次序,前序遍歷指的就是先遍歷根節點在訪問左子樹右子樹,中序後序同理。
樹、森林與二叉樹的轉化
樹與森林的轉化類似兒子兄弟表示法,轉化的方法爲,如果這個節點有左兄弟就把這個點和他的左兄弟連接起來然後把他和他父親之間的樹枝斷開,以此類推這樣一棵樹就會形成一個根節點沒有右兒子的樹(一開始沒有右兒子,自然不操作它。一開始有右兒子它就變成了左兒子的兒子)。這樣就可以討論森林的合併了,先把每一棵樹都按上述方法轉化爲二叉樹,這樣根節點就都是隻有左兒子的之後就可以依次把後面的二叉樹的根節點作爲前面二叉樹的右兒子連接起來。要是將二叉樹還原的話就倒過來操作就行了。先拆樹再拆兒子!