一、什么是二叉树?
二、二叉树的遍历方法
先序遍历:根—>左—>右
中序遍历:左—>根—>右
后序遍历:左—>右—>根
先根后左逆
例:
代码实现先序遍历:
/**
* 先序遍历
* @param rootTreeNode 根节点
*/
public static void preTraverseBTree(TreeNode rootTreeNode) {
//如果中序或后序遍历只需要改变下面代码的顺序就好了
if (rootTreeNode != null) {
//访问根节点
System.out.println(rootTreeNode.getValue());
//访问左节点
preTraverseBTree(rootTreeNode.getLefTreeNode());
//访问右节点
preTraverseBTree(rootTreeNode.getRightNode());
}
}
注意:
通过先序和中序或者中序和后序我们可以还原出原始的二叉树,但是通过先序和后续是无法还原出原始的二叉树的,即必须知道中序遍历的结果才能还原二叉树;
三、二叉查找树
定义:当前根节点的左边全部比根节点小,当前根节点的右边全部比根节点大。
优点:明眼人可以看出,这对我们来找一个数是非常方便快捷的
往往我们动态创建二叉树都是创建二叉查找树
动态创建二叉树代码实现:
TreeRoot.java表示根节点
public class TreeRoot {
private TreeNode treeRoot;
public TreeNode getTreeRoot() {
return treeRoot;
}
public void setTreeRoot(TreeNode treeRoot) {
this.treeRoot = treeRoot;
}
}
比较与根谁大,大的往右边,小的往左边:
/**
* 动态创建二叉查找树
*
* @param treeRoot 根节点
* @param value 节点的值
*/
public static void createTree(TreeRoot treeRoot, int value) {
//如果树根为空(第一次访问),将第一个值作为根节点
if (treeRoot.getTreeRoot() == null) {
TreeNode treeNode = new TreeNode(value);
treeRoot.setTreeRoot(treeNode);
} else {
//当前树根
TreeNode tempRoot = treeRoot.getTreeRoot();
while (tempRoot != null) {
//当前值大于根值,往右边走
if (value > tempRoot.getValue()) {
//右边没有树根,那就直接插入
if (tempRoot.getRightNode() == null) {
tempRoot.setRightNode(new TreeNode(value));
return ;
} else {
//如果右边有树根,到右边的树根去
tempRoot = tempRoot.getRightNode();
}
} else {
//左没有树根,那就直接插入
if (tempRoot.getLefTreeNode() == null) {
tempRoot.setLefTreeNode(new TreeNode(value));
return;
} else {
//如果左有树根,到左边的树根去
tempRoot = tempRoot.getLefTreeNode();
}
}
}
}
}
测试代码:
int[] arrays = {2, 3, 1, 4, 5};
//动态创建树
TreeRoot root = new TreeRoot();
for (int value : arrays) {
createTree(root, value);
}
//先序遍历树
preTraverseBTree(root.getTreeRoot());
System.out.println("---------------");
//中序遍历树
inTraverseBTree(root.getTreeRoot());
System.out.println("---------------");
测试结果: