对于二叉树的算法问题,我们可以根据二叉树本身的定义的递归性质求解,或者使用对二叉树的遍历算法进行求解.下面我们看几个关于二叉树高度,宽度和节点个数的算法
一,求二叉树的高度
1,使用二叉树递归定义的性质求二叉树的高度
如果根节点为空,返回0
否则
递归求左子树高度 getHeightRecurse(root.left)
递归求右子树高度 getHeightRecurse(root.right)
返回左右子树最大的高度加1
对应代码是:
public int getHeightRecurse(TreeNode<T> root) {
if (root == null) {
return 0;
}
int leftHeight = getHeightRecurse(root.left);
int rightHeight = getHeightRecurse(root.right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
2,利用层遍历求得树的高度
求得二叉树的最大的层次数,也就是二叉树的高度
代码如下:
/**
* 通过层次遍历来求得树的高度,每增加一层高度增加1
*
* @param root
* 树的根节点
* @return 树的高度
*/
public int getHeightByLevel(TreeNode<T> root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode<T>> queue = new LinkedList<TreeNode<T>>();
int front = 0, rear = 1, last = 1;
int height = 0;
queue.add(root);
TreeNode<T> node = null;
while (front != rear) {
node = queue.get(front);
if (node.left != null) {
queue.add(node.left);
rear++;
}
if (node.right != null) {
queue.add(node.right);
rear++;
}
front++;
// 本层节点遍历完毕
if (front == last) {
last = rear;
height++;
}
}
return height;
}
3,利用后序遍历的性质
当我们使用