Java代码实现复制一颗二叉树
时间: 2023-10-28 14:04:33 浏览: 54
可以使用递归的方式来复制一棵二叉树,实现代码如下:
```java
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class BinaryTreeCopy {
public TreeNode copy(TreeNode root) {
if (root == null) {
return null;
}
TreeNode copyRoot = new TreeNode(root.val);
copyRoot.left = copy(root.left);
copyRoot.right = copy(root.right);
return copyRoot;
}
}
```
在上面的代码中,我们首先判断根节点是否为空,如果为空直接返回null。否则,新建一个节点作为复制后的根节点,并递归的复制左右子树,最后返回复制后的根节点。
相关问题
Java代码实现判断一颗二叉树是否为完全二叉树
可以使用层次遍历的方式进行判断。具体步骤如下:
1. 对于一颗完全二叉树,如果节点i有左子树,那么节点i+1一定有左子树,如果节点i没有左子树了,那么节点i+1及以后的节点都没有左子树。
2. 对于一颗完全二叉树,如果节点i没有右子树,那么节点i+1及以后的节点都没有右子树。
3. 如果在遍历过程中出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树。
下面是Java代码实现:
```java
import java.util.LinkedList;
import java.util.Queue;
public class CompleteBinaryTree {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public static boolean isCompleteBinaryTree(TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean leafNode = false;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 如果出现了一个节点没有左子树或者右子树,但是后续节点却有子树,那么这棵树就不是完全二叉树
if (node.left == null && node.right != null) {
return false;
}
// 如果此时已经出现过叶子节点,但是后续节点却有子树,那么这棵树就不是完全二叉树
if (leafNode && (node.left != null || node.right != null)) {
return false;
}
if (node.left != null) {
queue.offer(node.left);
} else {
// 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树
leafNode = true;
}
if (node.right != null) {
queue.offer(node.right);
} else {
// 如果此时已经出现了叶子节点,但是后续节点却没有子树,那么这棵树就不是完全二叉树
leafNode = true;
}
}
return true;
}
public static void main(String[] args) {
// 测试用例
// 完全二叉树
// 1
// / \
// 2 3
// / \ / \
// 4 5 6
TreeNode root1 = new TreeNode(1);
root1.left = new TreeNode(2);
root1.right = new TreeNode(3);
root1.left.left = new TreeNode(4);
root1.left.right = new TreeNode(5);
root1.right.left = new TreeNode(6);
System.out.println(isCompleteBinaryTree(root1)); // true
// 非完全二叉树
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
TreeNode root2 = new TreeNode(1);
root2.left = new TreeNode(2);
root2.right = new TreeNode(3);
root2.left.left = new TreeNode(4);
root2.left.right = new TreeNode(5);
root2.right.left = new TreeNode(6);
root2.right.right = new TreeNode(7);
System.out.println(isCompleteBinaryTree(root2)); // false
}
}
```
java代码实现求一颗二叉树在后根次序遍历下第一个访问的结点
可以使用递归的方法来实现求一颗二叉树在后根次序遍历下第一个访问的节点。具体实现如下:
```java
public TreeNode findLastVisitedNode(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = findLastVisitedNode(root.left);
TreeNode right = findLastVisitedNode(root.right);
if (left == null && right == null) {
return root;
} else if (left == null) {
return right;
} else {
return left;
}
}
```
在该方法中,首先判断当前节点的左右子树是否为空,如果均为空,则说明当前节点为后序遍历的最后一个节点,直接返回该节点即可。如果左子树为空,则说明右子树是后序遍历的最后一个节点,直接返回右子树的结果。否则,返回左子树的结果。
需要注意的是,该方法求得是后序遍历下第一个访问的节点,而不是第一个被访问的节点。