实现二叉树基本操作
二叉树基本操作
1. 获取二叉树中节点个数
计数器思路:
public int nodeNum;
public void size1(TreeNode root) {
if (root == null) {
return;
}
this.nodeNum++;
size1(root.left);
size1(root.right);
}
子问题思路:
每颗树节点个数 = 左子树节点个数 + 右子树节点个数 + 1(根)


public int size2(TreeNode root) {
if (root == null) {
return 0;
}
return size2(root.left)
+ size2(root.right) + 1;
}
2. 获取二叉树叶子节点个数
计数器思路:
public int leafNodeNum;
public void getLeafNodeCount1(TreeNode root) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
this.leafNodeNum++;
}
getLeafNodeCount1(root.left);
getLeafNodeCount1(root.right);
}
子问题思路:
每颗树叶子节点个数 = 左子树叶子节点个数 + 右子树节点个数


public int getLeafNodeCount2(TreeNode root) {
if (root == null) {
return 0;
}
if (root.left == null && root.right == null) {
return 1;
}
return getLeafNodeCount2(root.left)
+ getLeafNodeCount2(root.right);
}
3. 获取第K层节点的个数


public int getKLevelNodeCount(TreeNode root,int k) {
if (root == null) {
return 0;
}
if (k == 1) {
return 1;
}
return getKLevelNodeCount(root.left,k-1)
+ getKLevelNodeCount(root.right,k-1);
}
4. 获取二叉树的高度
思路:
每颗树的高度 = 左子树与右子树高度的最大值 + 1(根)


public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = getHeight(root.left);
int rightHeight = getHeight(root.right);
return Math.max(leftHeight,rightHeight) + 1;
}
5. 检测值为value的元素是否存在


public TreeNode find(TreeNode root, int val) {
if (root == null) {
return null;
}
if (root.val == val) {
return root;
}
TreeNode leftVal = find(root.left,val);
if (leftVal != null) {
return leftVal;
}
TreeNode rightVal = find(root.right,val);
if (rightVal != null) {
return rightVal;
}
return null;
}
6. 层序遍历

什么层序遍历 ? 从上到下 从左到右依次打印
如何非递归实现 层序遍历 ? 使用队列结构

public void levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
System.out.print(cur.val+" ");
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
}
栈能否实现层序遍历 ?

7. 判断一棵树是不是完全二叉树

public boolean isCompleteTree(TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur != null) {
queue.offer(cur.left);
queue.offer(cur.right);
}else {
break;
}
}
while (!queue.isEmpty()) {
if (queue.poll() != null) {
return false;
}
}
return true;
}
浙公网安备 33010602011771号