1. 程式人生 > >二叉樹的概念及建立

二叉樹的概念及建立

二叉樹的概念

一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成。

二叉樹的形式

在這裡插入圖片描述

二叉樹的性質

1.若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2^(i-1)(i>0)個結點
2.若規定只有根節點的二叉樹的深度為1,則深度為K的二叉樹的最大結點數是2^k-1(k>=0)
3.對任何一棵二叉樹, 如果其葉結點個數為 n0, 度為2的非葉結點個數為 n2,則有n0=n2+1
4.具有n個結點的完全二叉樹的深度k為log2(n+1)上取整
5.對於具有n個結點的完全二叉樹,如果按照從上至下從左至右的順序
對所有節點從0開始編號,則對於序號為i的結點有:

  1. 若i>0,雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親結點
  2. 若2i+1<n,左孩子序號:2i+1,否則無左孩子
  3. 若2i+2<n,右孩子序號:2i+2,否則無右孩子

二叉樹的建立

這裡採用先序遍歷建立,但要注意的是單純的靠先序遍歷是無法還原一顆二叉樹的,所以這裡的先序建立指的是帶空節點的先序建立,也就是說,當子樹為空的時候,也是要建立的,只不過建立的是空節點。程式碼如下:

typedef int TDatatype;
//二叉樹的定義
typedef struct BNode {
	TDatatype data;
	struct BNode *left;
	struct BNode *right;
}BNode;
//這裡主要是為了每次建立完之後把用了大小返回,方便下一個建立
typedef struct {
	BNode *root;
	int used;
}RESULT;
BNode * CreateNode(TDatatype data)
{
	BNode * node = (BNode*)malloc(sizeof(BNode));
	node->data = data;
	node->left = node->right = NULL;
	return node;
}
RESULT CreateTree(TDatatype preorder[], int size)
{
	if (size == 0)
	{
		RESULT result = { NULL,0 };
		return result;
	}
	TDatatype rootvalue = preorder[0];
	if (rootvalue == -1)
	{
		RESULT result = { NULL,1 };
		return result;
	}
	BNode *root = CreateNode(rootvalue);
	RESULT lr= CreateTree(&preorder[1], size - 1);
	root->left = lr.root;
	RESULT rr = CreateTree(&preorder[1 + lr.used], size - 1 - lr.used);
	root->right = rr.root;

	RESULT result = { root,1 + lr.used + rr.used };
	return result;
}