1.树的定义

  • 根结点(root):对一棵树树来说最多存在一个根结点。
  • 叶子结点(leaf):叶子节点不再延伸出新的结点,即度为0的结点。
  • 边(edge):茎干和树枝的统一抽象,且一条边只用来连接两个结点,
     树被定义成由若干个结点和若干条边组成的数据结构,且在树中的结点不能被边连接成环。
     
    比较实用的概念和性质:
     (1)空树(empty tree):没有结点。
     (2)树的层次(layer)从根结点开始算起,即根点为第一层,根结点子树的根结点为第二层。以此内推。
     (3)把结点的子树颗数称为结点的度(degree)
    ,而树中结点的最大的度称为树的度(也称为树的宽度)。
     (4)对有n个结点的树,边数一定是n-1。且满足连通、边数等于顶点数减1的结构一定是一棵树。
     (5)当树中只有一个结点(只有根结点)时,根结点也算作叶子结点。
     (6)结点的深度:指从根结点(深度为1)开始自顶向下逐层累加至该结点的深度。
     结点的高度:指从最底层叶子结点(高度为1)开始自底向上逐层至该结点时的高度值。
     树的深度指树中结点的最大深度。树的高度是指树中结点的最大高度。对树而言,深度和高度都是相等的。
     (7)多棵树组合在一起成为森林。
     
    2.二叉树的递归定义
      - 要么二叉树没有根结点,是一颗空树。
      - 要么二叉树由,根结点、左子树、右子树组成,且左子树和右子树都是二叉树。

二叉树是度为2,且严格区分左右子树的树。
 
 (1)满二叉树:每一层的结点个数都达到了当层能达到的最大结点树。
 (2)完全二叉树:除了最下面一层之外,其余层的结点个数都达到了当层能达到的最大结点数,且最下面一层只从左至右连续存在若干结点,而这些连续结点右边的结点全部不存在。
 
3.二叉树的存储结构与基本操作
(1)使用链表来定义的二叉树:

struct node{
	typename data;//数据域
	node* lchild;//指向左子树根结点的指针
	node* rchild;//指向右子树根结点的指针
};

根结点的初始:

node* root = NULL;

(2)新建结点的函数:

node* newNode(int v){
	node* Node = new node;
	Node->data = v;
	Node->lchild = Node->rchild = NULL;
	return Node;
}

(3)二叉树结点的查找、修改
 使用递归来完成,递归式:对左右子节点进行递归。递归边界,当前结点为空。

void search(node* root,int x,int newDate){
	if(root == NULL) return;
	if(root->data == x){
		root->data = newData;
		return;
	}
	search(root->lchild,x,newData);
	search(root->rchild,x,newDta);
}

(4)二叉树结点的插入
    不同的问题有不同的插入条件,但二叉树的插入位置一般只会有一个,即为查找失败的的位置。下面代码供参考:

void insert(node* &root,int x){
	if(root == NULL){
		root = newNode(x);
		return;
	}
	if(由二叉树的性质,x应该插在左子树){
		insert(root->lchild,x);
		}else{
			insert(root->rchild,x);
		}
	}

此处用了引用,而查找修改的函数中没用。因为在这里是新建结点,对二叉树的结构做出了修改,需要加引用才能修改到原变量。如果只是修改当前已有结点的内容,就不用加引用。

(5)二叉树的创建
 二叉树的创建其实就是二叉树结点的插入过程,而插入所需要的结点数据域一般都会由题目给出,因此比较常用的写法是把需要插入的数据存储在数组中,然后再将它们使用insert函数一个个插入二叉树中,并最终返回根结点的指针root。

node* Create(int a[],int n){
	node* Node = new node;
	for(int i =0;i<n;i++){
		insert(root,a[i]);
		}
		return root;
	}

对于完全二叉树当中的任何一个结点(设编号为x),其左孩子的编号一定是2x,而右孩子的编号一定是2x+1。且根结点为1。
 完全二叉树完全可以通过建立一个大小为2^k的数组来存放所有结点的信息,其中k为完全二叉树的最大高度。
 该数组中元素存放的顺序恰好为该完全二叉树的层序遍历序列。