class TreeNode {
Integer val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
TreeNode initRight(int val) {
TreeNode right = new TreeNode(val);
this.right = right;
return right;
}
TreeNode initLeft(int val) {
TreeNode left = new TreeNode(val);
this.left = left;
return left;
}
}
void initTree(TreeNode p, Integer deep) {
deep--;
if (deep > 0) {
p.left = new TreeNode(++i);
initTree(p.left, deep);
p.right = new TreeNode(++i);
initTree(p.right, deep);
}
}
private int i;//tree递增初始值
private Integer var = 3;
List<TreeNode> list = new ArrayList<>();
List<TreeNode> resList = new LinkedList<>();
Boolean loopTree(TreeNode root) {
System.out.println(root.val);
if (root.val == var) {
list.add(root);
return true;
}
if (null != root.left) {//System.out.println(root.left.val);
if (loopTree(root.left)) {
list.add(root);
return true;
}
}
if (null != root.right) {// System.out.println(root.right.val);
if (loopTree(root.right)) {
list.add(root);
return true;
}
}
return false;
}
@Test
public void distanceK() {
i = 1;
int k = 4;
TreeNode root = new TreeNode(0);
// root.initLeft(1).initRight(2).initRight(3).initRight(4);
initTree(root, 4);
loopTree(root);//获取根节点到目标节点路径。
for (int j = 0; j < list.size(); j++) {
TreeNode node = list.get(j);
int getDeep = k - j;
if (getDeep <= 0) {
if (getDeep == 0) resList.add(node);
break;
}
if (j == 0) {
loopGetK(node, getDeep);
} else if (isLeft(j - 1)) {//左节点
if (getDeep == 1) {
if (null != node.right) resList.add(node.right);
} else {
if (null != node.right) loopGetK(node.right, getDeep - 1);
}
} else {//右节点
if (getDeep == 1) {
if (null != node.left) resList.add(node.left);
} else {
if (null != node.left) loopGetK(node.left, getDeep - 1);
}
}
}
System.out.println(resList.size());
}
//判断是否左节点
Boolean isLeft(int i) {
return list.get(i + 1).left == list.get(i);
}
//返回节点的第n层 子节点
void loopGetK(TreeNode node, int n) {
if (n == 1) {
if (null != node.left) resList.add(node.left);
if (null != node.right) resList.add(node.right);
return;
}
if (null != node.left) loopGetK(node.left, n - 1);
if (null != node.right) loopGetK(node.right, n - 1);
}
以遍历的方式获取二叉树中所有距离为 K 的结点
最新推荐文章于 2024-08-23 15:54:50 发布
这篇博客探讨了一种二叉树的初始化和遍历方法,用于找到目标节点及其路径。通过递归实现深度优先遍历,寻找与给定值匹配的节点,并进一步获取距离目标节点K步的节点。同时,提供了判断节点是否为左节点的辅助方法,以及获取指定层级子节点的逻辑。
摘要由CSDN通过智能技术生成