您的位置:首页 > 其它

求二叉树中的节点个数、求二叉树的深度(高度)

2015-04-03 09:51 120 查看
private static class TreeNode {
int val;
TreeNode left;
TreeNode right;

public TreeNode(int val) {
this.val = val;
}
}

/**
* 求二叉树中的节点个数递归解法: O(n)
* (1)如果二叉树为空,节点个数为0
* (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 +
*            右子树节点个数 + 1
*/
public static int getNodeNumRec(TreeNode root) {
if (root == null) {
return 0;
} else {
return getNodeNumRec(root.left) + getNodeNumRec(root.right) + 1;
}
}

/**
*  求二叉树中的节点个数迭代解法O(n):基本思想同LevelOrderTraversal,
*  即用一个Queue,在Java里面可以用LinkedList来模拟
*/
public static int getNodeNum(TreeNode root) {
if(root == null){
return 0;
}
int count = 1;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);

while(!queue.isEmpty()){
TreeNode cur = queue.remove();      // 从队头位置移除
if(cur.left != null){           // 如果有左孩子,加到队尾
queue.add(cur.left);
count++;
}
if(cur.right != null){      // 如果有右孩子,加到队尾
queue.add(cur.right);
count++;
}
}

return count;
}

/**
* 求二叉树的深度(高度) 递归解法: O(n)
* (1)如果二叉树为空,二叉树的深度为0
* (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
*/
public static int getDepthRec(TreeNode root) {
if (root == null) {
return 0;
}

int leftDepth = getDepthRec(root.left);
int rightDepth = getDepthRec(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}

/**
* 求二叉树的深度(高度) 迭代解法: O(n)
* 基本思想同LevelOrderTraversal,还是用一个Queue
*/
public static int getDepth(TreeNode root) {
if(root == null){
return 0;
}

int depth = 0;                          // 深度
int currentLevelNodes = 1;      // 当前Level,node的数量
int nextLevelNodes = 0;         // 下一层Level,node的数量

LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);

while( !queue.isEmpty() ){//循环中队列仅包含当前层的节点
TreeNode cur = queue.remove();      // 从队头位置移除
currentLevelNodes--;            // 减少当前Level node的数量
if(cur.left != null){               // 如果有左孩子,加到队尾
queue.add(cur.left);
nextLevelNodes++;           // 并增加下一层Level node的数量
}
if(cur.right != null){          // 如果有右孩子,加到队尾
queue.add(cur.right);
nextLevelNodes++;
}

if(currentLevelNodes == 0){ // 说明已经遍历完当前层的所有节点
depth++;                       // 增加高度
currentLevelNodes = nextLevelNodes;     // 初始化下一层的遍历
nextLevelNodes = 0;
}
}

return depth;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐