
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合 它具有以下的特点:

注意:

None 。满二叉树: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵 二叉树的层数为K,且结点总数是2^k - 1 ,则它就是满二叉树。

完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

完满二叉树:除了叶节点之外,其余所有节点都有两个子节点。

平衡二叉树:中任意节点的左子树和右子树的高度之差的绝对值不超过 1 。

题目:某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为? 题解:由二叉树的性质,如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1,所以n0 = 199 +1 = 200.
题目:在具有 2n 个结点的完全二叉树中,叶子结点个数为( ) 题解: 2n为偶数,因此有一个度为1的节点。 2n = n0 + 1 + n2 = n0 + 1 + n0 - 1 2n = 2n0 n0 = n
题目:一个具有767个节点的完全二叉树,其叶子节点个数为() 767为奇数没有度为1的节点,767 = n0 + n1 + n2 767 = n0 + 0 + n2 题解:由n0 = n2 + 1推出n2 = n0 - 1 767 = n0 + 0 + n0 -1 -> 767 = 2n0 - 1 所以:n0 = 768 / 2 = 384
题目:一棵完全二叉树的节点数为531个,那么这棵树的高度为( ) 题解:已知节点求高度,运用性质4,h = log(n+1)向上取证。h = log(531+1),向上取整为10
题目:将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为() 因为根节点编号从1开始且为完全二叉树,根据性质若2i<n,左孩子序号:2i 所以父节点为98/2 = 49
题目: 一颗拥有1000个结点的树,树的度(即一个节点的最大子节点数)为4,则它的最小深度是( ) 当这棵树每一层都是满的时,它的深度最小。也就是说,这棵树应当是一棵满四叉树。 高度为h,则这个树的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。

题目:在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个。 题解:令n3 = 2;n2 = 1;n1 = 2;设总结点的个数为N 则由节点个数的关系得 N = n3 + n2 + n1 + n0,由边条数的关系得 N-1 = 3*n3 + 2*n2 + 1*n1 + 0*n0 联立可得:N = 2 + 1 + 2 + n0,N-1 = 3*2 + 2*1 + 1*2 + 0 n0 = 6
二叉树可以链式存储,也可以顺序存储。 链式存储方式就用指针, 顺序存储的方式就是用数组。 链式(指针指向):

顺序(数组):

用数组来存储二叉树如何遍历的呢? 如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。
二叉树主要有两种遍历方式:

class TreeNode {
public char val;
public TreeNode left;
public TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public TreeNode createTree (){
TreeNode A = new TreeNode('A');
TreeNode B = new TreeNode('B');
TreeNode C = new TreeNode('C');
TreeNode D = new TreeNode('D');
TreeNode E = new TreeNode('E');
TreeNode F = new TreeNode('F');
TreeNode G = new TreeNode('G');
TreeNode H = new TreeNode('H');
A.left = B;
A.right = C;
B.left = D;
B.right = E;
C.left = F;
C.right = G;
E.right = H;
return A;
}