二叉树的创建
二叉树的创建可以采用递归方式,传入一个数组,例如数组[3,9,20,null,null,15,7]
表示的二叉为
3
/ \
9 20
/ \
15 7
其中父节点i
的左右孩子节点分别为2*i+1
和 2*i+2
,根据该性质可进行递归建树,先构建左子树再构建右子树,伪代码为
Node CreateTree(int i){
if arr[i] == null
return null;
else{
node = new Node(arr[i]);
node.left = CreateTree(2*i + 1);
node.right = CreateTree(2*i + 2);
return node;
}
}
二叉树的遍历
先序遍历、中序遍历、后序遍历三种遍历都使用递归的方式进行遍历,区别在于访问语句的位置,先序遍历先访问根节点,中序遍历在中间访问根节点,后序遍历最后访问根节点。
层序遍历从根节点开始从上往下逐层遍历,在每一层从左到右对每个节点进行访问,实现时使用一个队列存储节点,每次将队头节点出队,并将其左右孩子节点入队,循环直到队列为空
对如下的二叉树,先序遍历的结果为ABDEGCF
,中序遍历DBGEAFC
,后序遍历结果为DGEBFCA
,层序遍历结果为ABCDEFG
。
Java实现
package test;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
public int val;
public TreeNode leftNode, rigthNode;
public TreeNode(int x) {
// TODO Auto-generated constructor stub
val = x;
}
}
class Tree {
public TreeNode rootNode;
public int vals[];
public Tree(int arr[]) {
vals = new int[arr.length];
for (int i = 0; i < arr.length; i++)
vals[i] = arr[i];
rootNode = CreateTree(0);
}
public TreeNode CreateTree(int pos) {
if (pos >= vals.length)
return null;
int val = vals[pos];
if (val == -99) {
// null
return null;
} else {
TreeNode node = new TreeNode(val);
node.leftNode = CreateTree(2 * pos + 1);
node.rigthNode = CreateTree(2 * pos + 2);
return node;
}
}
public void PreOrder() {
_preorder(rootNode);
System.out.println();
}
public void InOrder() {
_inorder(rootNode);
System.out.println();
}
public void PostOrder() {
_postorder(rootNode);
System.out.println();
}
public void LevelOrder() {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(rootNode);
while (queue.isEmpty() == false) {
// first node
TreeNode node = queue.poll();
System.out.print(node.val + " ");
if (node.leftNode != null)
queue.offer(node.leftNode);
if (node.rigthNode != null)
queue.offer(node.rigthNode);
}
System.out.println();
}
public void _preorder(TreeNode node) {
if (node != null) {
System.out.print(node.val + " ");
_preorder(node.leftNode);
_preorder(node.rigthNode);
}
}
public void _inorder(TreeNode node) {
if (node != null) {
_inorder(node.leftNode);
System.out.print(node.val + " ");
_inorder(node.rigthNode);
}
}
public void _postorder(TreeNode node) {
if (node != null) {
_postorder(node.leftNode);
_postorder(node.rigthNode);
System.out.print(node.val + " ");
}
}
}
public class main {
public static void main(String[] args) {
int arr[] = { 3, 9, 20, -99, -99, 15, 7 };
new Tree(arr).PreOrder();
new Tree(arr).InOrder();
new Tree(arr).PostOrder();
new Tree(arr).LevelOrder();
}
}