一 樹的基本概念
1.樹 : 它是n個節點的集合,滿足的條件
[1]只有乙個根節點
[2]其它節點可以看成是多顆子樹
2.樹的高度 : 節點層數的最大值
3.樹葉節點 : 沒有子節點
4.二叉樹 : 每個節點最多兩個子節點
5.完全二叉樹
(1)定義 : 只有最下面兩層有度數小於2的節點,且最下面一層的葉節點在最左邊
(2)特點 : 完全二叉樹的編號是連續的[根節點編號為1,從上到下,從左到右]
(3)性質 : 對序號為k的節點
[1]左孩子存在的條件 2*k <= n ,存在其左孩子序號為2*k
[2]右孩子存在的條件 2*k + 1 <= n,存在其右孩子序號為2*k + 1
6.二叉樹遍歷
(1)前序遍歷 : 根節點,左子樹,右子樹 [根,左,右] (遞迴)
(2)中序遍歷 : 左子樹,根節點,右子樹 [左,根,右] (遞迴)
(3)後序遍歷 : 左子樹,右子樹,根節點 [左,右,根] (遞迴)
(4)層次遍歷 : 從根節點開始,一層一層的遍歷 (非遞迴)
二 完全二叉樹
(1)二叉樹節點型別
typedef struct bnode
btree_t;
(2)完全二叉樹建立
注意:二叉樹的建立沒有統一的演算法,需要根據其特性建立對應的二叉樹
#define n 6
// 0 1 2 3 4 5 6
char buf = ;
btree_t *malloc_bnode(datatype data)
:btree_t *create_binarytree(char buf,int num)
//判斷右孩子是否存在,存在則建立右孩子
if(2 * num + 1 <= n)
return root;
}
分析過程:
create_binaryteee(buf,1)
|root = malloc_bnode(buf[1]);
if(2 * 1 <= 6)
root->lchild = create_binaryteee(buf,2);
|root = malloc_bnode(buf[2]);
if(2 * 2 <= 6)
root->lchild = create_binaryteee(buf,4);
|root = malloc_bnode(buf[4]);
if(2 * 4 <= 6)
...if(2 * 4 + 1 <= 6)
...return root;
if(2 * 2 + 1 <= 6)
root->rchild = create_binaryteee(buf,5);
|root = malloc_bnode(buf[5]);
if(2 * 5 <= 6)
...if(2 * 5 + 1 <= 6)
...return root;
return root;
if(2 * 1 + 1 <= 6)
root->rchild = create_binaryteee(buf,3);
|root = malloc_bnode(buf[3])
if(2 * 3 <= 6)
root->lchild = create_binaryteee(buf,6);
|root = malloc_bnode(buf[6]);
if(2 * 6)
...if(2 * 6 + 1)
...return root;
if(2 * 3 + 1 <= 6)
...return root;
return root;
三 二叉樹的層次遍歷
核心思想:使用佇列技術
[1]建立乙個佇列
[2]將根節點進隊
[3]判斷佇列是否為空
[4]temp = 出隊
[5]列印temp->data的值
[6]判斷出隊節點的左孩子是否存在,如果存在則將其左孩子進隊
[7]判斷出隊節點的右孩子是否存在, 如果存在則將其右孩子進隊
[8]繼續第三步
int noorder(btree_t *root)
if(temp->rchild != null)
}printf("\n");
return;
}
**如下:
head.h:
#ifndef _head_h_
typedef char datatype1;
typedef struct bnode
btree_t;
typedef btree_t * datatype;//datatype <=>btree_t *
//資料節點型別
typedef struct node
linknode;
//佇列/
typedef struct
linkqueue;
extern linkqueue *create_empty_linkqueue();
extern int is_empty_linkqueue(linkqueue *q);
extern int enter_linkqueue(linkqueue *q,datatype data);
extern datatype delete_linkqueue(linkqueue *q);
#endif
linkqueue.c
#include #include #include "head.h"
linkqueue *create_empty_linkqueue()
int is_empty_linkqueue(linkqueue *q)
int enter_linkqueue(linkqueue *q,datatype data)
datatype delete_linkqueue(linkqueue *q)
binarytree.c
#include #include #include "head.h"
#define n 6
btree_t *malloc_bnode(datatype1 data)
btree_t *create_binarytree(char buf,int num)
if(2 * num + 1 <= n)
return root;
}void preorder(btree_t *root)
void inorder(btree_t *root)
void postorder(btree_t *root)
void noorder(btree_t *root)
if(temp->rchild != null)
}printf("\n");
return;
}int main(int argc, const char *argv)
; btree_t *root;
root = create_binarytree(buf,1);
preorder(root);
printf("\n");
inorder(root);
printf("\n");
postorder(root);
printf("\n");
noorder(root);
printf("\n");
return 0;
}
二叉樹 滿二叉樹與完全二叉樹
二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由乙個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每乙個元素都稱為結點。通常二叉樹的許多名...
樹與二叉樹
樹是一類重要的非線性資料結構,是以分支關係定義的層次結構 定義 樹 tree 是n n 0 個結點的有限集t,其中 n 0時為空樹 n 0時,有且僅有乙個特定的結點,稱為樹的根 root 當n 1時,其餘結點可分為m m 0 個互不相交的有限集t1,t2,tm,其中每乙個集合本身又是一棵樹,稱為根的...
樹與二叉樹
建立 先序二叉樹,中序二叉樹,後序二叉樹。給定兩種遍歷序列 前序中序或後序中序 重塑二叉樹 遍歷 判斷乙個節點是否存在於二叉樹中 二叉樹的遍歷 先序,中序,後序 遞迴 非遞迴 層次遍歷 從上到下或從下到上列印 zigzag遍歷方式層次遍歷 二叉樹性質 二叉樹中葉子節點的個數 二叉樹第k層節點數目 二...