樹與二叉樹(5 19)

2021-07-02 16:49:50 字數 3939 閱讀 2495

一 樹的基本概念

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層節點數目 二...