一、基本概念
每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。滿二叉樹:所有終端都在同一層次,且非終端結點的度數為2。性質:1、非空二叉樹的第n層上至多有2^(n-1)個元素。
2、深度為h的二叉樹至多有2^h-1個結點。
在滿二叉樹中若其深度為h,則其所包含的結點數必為2^h-1。完全二叉樹:除了最大的層次即成為一顆滿二叉樹且層次最大那層所有的結點均向左靠齊,即集中在左面的位置上,不能有空位置。
對於完全二叉樹,設乙個結點為i則其父節點為i/2,2i為左子節點,2i+1為右子節點。遞迴實現(以前序遍歷為例,其他的只是輸出的位置稍有不同)二、儲存結構
鏈式儲存:
typedef char datatype;三、二叉樹的遍歷typedef struct binnodebinnode;
typedef binnode* bintree;
遍歷即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序遍歷,中序遍歷,後序遍歷。
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
void preorder(bintree t)
}
非遞迴的實現
1、前序遍歷
void preorder_dev(bintree t)else
t=pop(&s);
t=t->rchild;
} }
}
2、中序遍歷
void midorder(bintree t)else
t=pop(&s);
printf("%c ",t->data);
t=t->rchild;
} }
}
3、後序遍歷
void
postorder_dev(bintree t)else
if(s.tag[s.top] == 0)else
t = null; //必須將t置空。跳過向左走,直接向右走
} }
} }
4、層次遍歷:即每一層從左向右輸出
元素需要儲存有先進先出的特性,所以選用佇列儲存。佇列的定義:
#define max 1000
typedef struct seqqueueseqqueue;
void enter(seqqueue *q,bintree t)else
}
bintree del(seqqueue *q)else
}
遍歷實現
void level_tree(bintree t)
enter(&q,t);
while(q.front != q.rear)
if(t->rchild)
} }
5、利用前序遍歷的結果生成二叉樹
//遞迴呼叫,不存點,想的時候只關注於乙個點,因為還會回來的,不要跟蹤程式執行,否則容易多加迴圈
void createtree(bintree *t)
}
6、二叉樹的查詢
bintree search_tree(bintree t,datatype x)
if(t->data == x)else
return t;
} }
7、統計結點個數
int count_tree(bintree t)
return 0;
}
8、比較兩個樹是否相同
int is_equal(bintree t1,bintree t2)
if(t1 && t2 && t1->data == t2->data)
} return 0;
}
9、求二叉樹的深度
int hight_tree(bintree t)
left = hight_tree(t->lchild);
right = hight_tree(t->rchild);
h = (left>right?left:right)+1;
return h;
}
二叉樹的建立,前序,中序,後序,層序遍歷
二叉樹 binary tree 是另一種樹形結構,它的特點是每個節點至多有兩顆子樹,並且其子樹有左右之分,並且順序不能顛倒。主要用遞迴的思想完成建立,遍歷等操作。binarytree const t arr,const t invalied 傳入乙個順序為前序的陣列,invalied意味節點為nul...
二叉樹的遞迴遍歷 (前序,中序,後序,層序)
首先我們來講前序遍歷。前序遍歷很簡單,首先判斷根樹是否為空 注意前序遍歷的次序是 根 左子樹 右子樹 如此遞迴呼叫。以下為 templatevoid bitree preorder binode bt 中序遍歷是實際問題中經常使用的一種遍歷。其 形式與前序遍歷很相似,其遍歷順序為 左子樹 根 右子樹...
二叉樹遍歷(前序,中序,後序
二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...