二叉树的创建与遍历

1,399 阅读2分钟

内容导读:本文介绍了二叉树对象的创建,二叉树节点的遍历,以及计算二叉树的深度的方法。

创建二叉树

第1步:创建一个二叉树节点对象

/**
 * 二叉树节点对象
 */
public class TreeNode {
    // 节点值
    public int nodeValue;
    // 左节点
    public TreeNode leftNode;
    // 右节点
    public TreeNode rightNode;
    // 构造方法
    public TreeNode(int nodeValue) {
        this.nodeValue = nodeValue;
    }
}

第2步:连接节点组建成二叉树结构


public TreeNode createBinaryTree() {
    // 创建二叉树节点
    TreeNode treeNode0 = new TreeNode(0);
    TreeNode treeNode1 = new TreeNode(1);
    TreeNode treeNode2 = new TreeNode(2);
    TreeNode treeNode3 = new TreeNode(3);
    TreeNode treeNode4 = new TreeNode(4);
    TreeNode treeNode5 = new TreeNode(5);
    TreeNode treeNode6 = new TreeNode(6);
    TreeNode treeNode7 = new TreeNode(7);
    TreeNode treeNode8 = new TreeNode(8);
    TreeNode treeNode9 = new TreeNode(9);
    TreeNode treeNode10 = new TreeNode(10);
    // 连接二叉树节点
    treeNode0.leftNode = treeNode1;
    treeNode0.rightNode = treeNode2;
    treeNode1.leftNode = treeNode3;
    treeNode1.rightNode = treeNode4;
    treeNode2.leftNode = treeNode5;
    treeNode2.rightNode = treeNode6;
    treeNode3.leftNode = treeNode7;
    treeNode3.rightNode = treeNode8;
    treeNode4.leftNode = treeNode9;
    treeNode4.rightNode = treeNode10;
    return treeNode0;
}

第3步:以上代码对应的二叉树结构如下

遍历二叉树

  1. 先序遍历(根左右)

输出结果:0→1→3→7→8→4→9→10→2→5→6

public void traverseBinaryTree(TreeNode treeNode) {
    System.out.print(treeNode.nodeValue + "→");
    if (treeNode.leftNode != null) {
        traverseBinaryTree(treeNode.leftNode);
    }
    if (treeNode.rightNode != null) {
        traverseBinaryTree(treeNode.rightNode);
    }
}

  1. 中序遍历(左根右)

输出结果:7→3→8→1→9→4→10→0→5→2→6

public void traverseBinaryTree(TreeNode treeNode) {
    if (treeNode.leftNode != null) {
        traverseBinaryTree(treeNode.leftNode);
    }
    System.out.print(treeNode.nodeValue + "→");    
    if (treeNode.rightNode != null) {
        traverseBinaryTree(treeNode.rightNode);
    }
}

  1. 后序遍历(左右根)

输出结果:7→8→3→9→10→4→1→5→6→2→0

public void traverseBinaryTree(TreeNode treeNode) {
    if (treeNode.leftNode != null) {
        traverseBinaryTree(treeNode.leftNode);
    }
    if (treeNode.rightNode != null) {
        traverseBinaryTree(treeNode.rightNode);
    }
    System.out.print(treeNode.nodeValue + "→");
}

以上三种遍历方法,遍历的代码是完全相同的,不同的在于何时输出节点值(或加入到集合中),每次递归遍历的过程中,方法的参数是作为根节点传递进来的。因此,采用哪种遍历方式,只需要调用消费数据的位置即可。

计算二叉树的深度

/** 计算二叉树的深度 */
public int getTreeDepth(TreeNode root) {
    if (root == null) {
        return 0;
    } else {
        int leftDepth = getTreeDepth(root.leftNode)+1;
        int rightDepth = getTreeDepth(root.rightNode) + 1;
        return Math.max(leftDepth, rightDepth);
    }
}

参考资料:

图解二叉树的三种遍历方式及java实现