树数据结构的高度
在本教程中,我们将讨论二叉树。
我们将看到如何递归和迭代地计算树数据结构的高度。
二叉树
二叉树是一种数据结构,其中的数据是以分层方式而不是线性方式存储的(就像在LinkedList和Arrays中那样)。
二叉树数据结构由节点组成。
每个节点都保存数据以及对子指针(左和右)的引用。
二叉树的根是最顶层的节点。
(与实际的活树相反)。
以下是带有某些节点的树的图示。
节点的高度是从该节点到叶子的最长的向下路径的长度。
根的高度是树的高度。
因此,为了计算树的高度,我们需要遍历树的每个节点以获得所有排列和组合。
有两种计算树高的方法。
- 递归方式
- 迭代方式
树的高度–递归
递归涉及计算子问题的结果,并将其返回给父问题。
涉及的步骤:
要递归计算树的高度,我们需要递归地找到它的左子树和右子树的高度,并将它们的值加1(最高节点及其子节点之间的高度)。
这些子树中的每个子树本身都可以具有左右子树,因此递归将一直应用到子树为NULL为止。
空树节点的高度为-1。最后,我们将比较左右子树的高度,并返回更大的树。
下图显示了计算二叉树高度的排列数量。
让我们编写Java程序来递归计算树的高度。
首先,我们将对Tree数据结构进行基本的实现。
package com.theitroad.tree.height;
public class BinaryTree {
TreeNode root;
public static class TreeNode {
TreeNode left;
TreeNode right;
Object data;
TreeNode(Object data) {
this.data = data;
left = right = null;
}
}
}
我们来看一下使用递归查找树的高度的代码。
package com.theitroad.tree.height;
import com.theitroad.tree.height.BinaryTree.TreeNode;
public class HeightOfTree {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
/**
* Binary Tree in our example, height = 2
* 1 (Root)
* 2 3 (Level 1)
* 4 5 (Level 2)
*/
binaryTree.root = new TreeNode(1);
binaryTree.root.left = new TreeNode(2);
binaryTree.root.right = new TreeNode(3);
binaryTree.root.left.left = new TreeNode(4);
binaryTree.root.right.left = new TreeNode(5);
int heightOfTree = height(binaryTree.root);
System.out.printf("Height of tree is %d", heightOfTree);
}
public static int height(TreeNode root) {
if (root == null)
return -1;
int leftHeight = height(root.left);
int rightHeight = height(root.right);
return Math.max(leftHeight, rightHeight) + 1;
}
}
因此,在上面的代码中,一旦到达最底层的子节点,便将其加到树的高度,然后将结果返回到上一个调用。
输出:树的高度为2
现在,让我们以非递归方式执行相同的操作。
树的高度–迭代
要迭代计算树的高度,我们只需要计算树中的级别数。
涉及的步骤
创建一个队列,并将树的根添加到其中。
从队列中弹出节点并遍历队列,同时将子节点添加到队列中。
在每个迭代弹出窗口中,最新元素添加到队列中,并将下一级元素(此元素)添加到队列中。
这样做直到队列大小变为零。
那将意味着下一级别具有零个元素。对于每个遍历的级别,添加1。
以下是计算树的高度的迭代程序。
public static int heightIteratively(TreeNode root) {
if (root == null)
return -1;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int height = -1;
while (!queue.isEmpty()) {
int size = queue.size();
height++;
while (size > 0) {
TreeNode treeNode = queue.remove();
if (treeNode.left != null)
queue.add(treeNode.left);
if (treeNode.right != null)
queue.add(treeNode.right);
size--;
}
}
return height;
}
上面的代码一直运行,直到队列不为空。
而且,它会在从队列中删除当前级别项目的同时,继续在下一级别添加所有元素。
时间复杂度为O(n)。
空间复杂度为O(1)。

