1. 程式人生 > >完全二叉樹/ 滿二叉樹/二叉樹遍歷(前序、中序、後序、層序遍歷)

完全二叉樹/ 滿二叉樹/二叉樹遍歷(前序、中序、後序、層序遍歷)

1.概念

    在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^{i-1}個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹T,如果其終端結點數為n_0,度為2的結點數為n_2,則n_0=n_2+1。一棵深度為k,且有2^k-1個節點稱之為滿二叉樹;深度為k,有n個節點的二叉樹,當且僅當其每一個節點都與深度為k的滿二叉樹中,序號為1至n的節點對應時,稱之為完全二叉樹。

    二叉樹在圖論中是這樣定義的:二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的資訊來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分量,這樣的結構叫做森林。

(1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。

(2)滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

(3)平衡二叉樹——平衡二叉樹又被稱為AVL樹(區別於AVL演算法),它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。


2.程式碼

//Implementation code for Binary Tree
//功能:按照約定,以前序遍歷的方法輸入資料,輸出資料所在層數

//遞迴依次賦值:
//根結點 - 左結點 - 右結點(前序遍歷法)
//左結點 - 根結點 - 右結點(中序遍歷法)
//左結點 - 右結點 - 根結點(後序遍歷法)

#include <stdio.h>
#include <stdlib.h>
//#include <string>
typedef char ElemType;

typedef struct BiTNode           //定義二叉樹結點
{
	
	char data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
char string[100];
//建立一顆二叉樹,約定使用者遵循的前序遍歷方式輸入資料
void CreateBiTree(BiTree *T)
{
	char c;
	scanf("%c", &c);
	if (' ' == c)
	{
		*T = NULL;               //遞迴終止條件
	}
	else
	{
		*T = (BiTNode*)malloc(sizeof(BiTNode));
		(*T)->data = c;
		//遞迴依次賦值 此處:根結點-左結點-右結點(前序遍歷法)
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}

void visit(char c, int level)
{
	printf("%c 位於第 %d 層 \n", c, level);
}
//遍歷二叉樹
//引數  T  : 要遍歷的二叉樹
//引數level: 遍歷開始的層數
void PreOrderTraverse(BiTree T, int level)
{	
	if (T)                       //遍歷終止條件 NULL
	{
		visit(T->data, level);   //遞迴:根 - 左 - 右
	
		PreOrderTraverse(T->lchild, level + 1);
		PreOrderTraverse(T->rchild, level + 1);
	}
}
int main()
{
	int level = 1;
	BiTree T = NULL;
	
	CreateBiTree(&T);
	PreOrderTraverse(T, level);

	return 0;
}


3.結果