给定一棵二叉树:高度为3的二叉树
我想找出同一水平上两个节点之间的水平距离,也计算不在中间的节点,而不计算节点本身,比如在
f
/ \
g h
/ \ / \
a d
节点a和d之间的水平距离为2。
编辑:
请参见,a到d之间的距离是在同一级别上计算的,不包括a或d的父节点或子节点,但只包括同一级别上缺少的节点。所以a到d之间的距离是
Here is the code:
/**
*
* @author satish hawalppagol
*
*/
public class BinaryTreeTest
{
public int findDistance(Node root, int n1, int n2)
{
int leftNodeToRootNode = Pathlength(root, n1, "leftNodeToRootNode") - 2;
int rightNodeToRootNode = Pathlength(root, n2,"rightNodeToRootNode") - 2;
int lcaData = findLCA(root, n1, n2).data; //LCA->Lowest Common Ancestor
int lcaDistance = Pathlength(root, lcaData,"lcaDistance") - 1;
return (leftNodeToRootNode + rightNodeToRootNode) - 2 * lcaDistance;
}
public int Pathlength(Node root, int n1,String callingFrom)
{
if (root != null)
{
int x = 0;
if("rightNodeToRootNode" == callingFrom)
{
if(root.left ==null && root.right ==null)
{
//do nothing
}
else if(root.left ==null || root.right ==null)
{
System.out.println("counting the position where the node is not
present is : " + root.data);
}
if ((root.data == n1) || (x = Pathlength(root.left,
n1,"rightNodeToRootNode")) > 0 || (x = Pathlength(root.right,
n1,"rightNodeToRootNode")) > 0)
{
return x + 1;
}
}
if("rightNodeToRootNode" != callingFrom )
{
if ((root.data == n1) || (x = Pathlength(root.left,
n1,"leftNodeToRootNode")) > 0 || (x = Pathlength(root.right,
n1,"leftNodeToRootNode")) > 0)
{
return x + 1;
}
}
return 0;
}
return 0;
}
public Node findLCA(Node root, int n1, int n2)
{
if (root != null)
{
if (root.data == n1 || root.data == n2)
{
return root;
}
Node left = findLCA(root.left, n1, n2);
Node right = findLCA(root.right, n1, n2);
if (left != null && right != null)
{
return root;
}
if (left != null)
{
return left;
}
if (right != null)
{
return right;
}
}
return null;
}
public static void main(String[] args) throws java.lang.Exception
{
Node root = new Node(5);
root.left = new Node(2);
root.right = new Node(3);
/*root.left.right = new Node(12);*/
root.left.left = new Node(7);
root.left.left.left = new Node(9);
/*root.left.left.right = new Node(17);*/
root.right.right = new Node(1);
/*root.right.right.left = new Node(4);*/
root.right.right.right = new Node(6);
BinaryTreeTest binaryTreeTest = new BinaryTreeTest();
System.out.println("Distance between 9 and 6 is : " +
binaryTreeTest.findDistance(root,9, 6));
}
}
class Node
{
int data;
Node left;
Node right;
public Node(int data)
{
this.data = data;
this.left = null;
this.right = null;
}
}
///////////input/////////
// 5 //
// / \ //
// 2 3 //
// / \ \ //
// 7 1 //
// / \ / \ //
// 9 6 //
///////////input/////////
counting the position where the node is not present is : 2
counting the position where the node is not present is : 7
counting the position where the node is not present is : 3
counting the position where the node is not present is : 1
Distance between 9 and 6 is : 4
就内存而言,这是一种可能不是最佳解决方案的方法。
因此,欢迎提出建议/改进。
算法-
复杂性-时间:O(N)空间:O(N)
假设-BT中的每个节点都有唯一的值。
class Node {
Node() {
value = -1;
}
Node(int num) {
value = num;
}
int value;
Node left = null;
Node right = null;
}
声明一些必需的DS
static Queue<Node> queue = new LinkedList<Node>();
static ArrayList<Integer> list = new ArrayList<Integer>();
static Set<Integer> set = new HashSet<Integer>();
然后是三个功能
static void convertBTToArray() {
if (set.isEmpty())
return;
Node node = queue.poll();
if (node != null) {
list.add(node.value);
if (node.value != -1)
set.remove(node.value);
if (node.left != null) {
queue.add(node.left);
set.add(node.left.value);
} else
queue.add(new Node());
if (node.right != null) {
queue.add(node.right);
set.add(node.right.value);
} else
queue.add(new Node());
convertBTToArray();
} else
return;
}
static void init(Node root) {
// traverse in BFS fashion (level order) and convert to Array.
Node rootCopy = root;
if (rootCopy != null) {
queue.add(rootCopy);
set.add(rootCopy.value);
convertBTToArray();
}
}
// get distance between start and end values.
static int getHorizontalDistance(int startValue, int endValue) {
int startIndex = -1, endIndex = -1;
for (int i = 0; i < list.size(); i++) {
if (startIndex == -1)
startIndex = list.get(i) == startValue ? i : -1;
if (list.get(i) == endValue) {
endIndex = i;
break;
}
}
// check if both numbers are from same level else return -1
if (Math.floor(Math.log(startIndex + 1) / Math.log(2)) >= 0
&& Math.floor(Math.log(endIndex + 1) / Math.log(2)) >= 0)
return (endIndex - startIndex - 1);
else
return -1;
}
最后是主要方法
public static void main(String...s) {
// create your tree and enter elements here
// -1 indicates that distance cant be found and hence invalid input.
System.out.println("Dist(7,1): "+getHorizontalDistance(7, 1));
}
这样想:
a
/ \
b c
/ \ / \
e f g h
现在,您需要确定同一级别上节点之间的水平距离。例如:f和g。这里有一个逐步的方法:
更新:正如anand_v.singh所指出的,如果树可能没有在所有级别上完全填充,那么它可能会产生错误的结果
为克服此问题,将确定一个名为树高
的附加参数。假设树的高度为3,那么数组将最多包含2个tree\u height-1元素,所有元素都初始化为不等于任何树节点值的值。现在,您可以使用类似于二进制堆的数组表示的东西,将节点值放置到数组中,并在其各自的索引处。然后按照上述步骤获得结果。
有谁能帮助我理解下面的算法,如何找出二叉树中任意两个节点之间的最大差异。 http://www.geeksforgeeks.org/maximum-difference-between-node-and-its-ancestor-in-binary-tree/ 我不明白为什么他们试图从左子树和右子树得到最小值,而实际上我们想要最大的差异 提前谢谢!!
我被这个问题的修改版本困住了(在二叉树中找到距离为k的两个节点)。 我试图定义两个节点之间的距离,我认为这是沿着树状分支从节点n1移动到节点n2所需的最小节点数。 从这个假设出发,我得到了一个情况,我认为我需要知道每个节点是在根的左边还是右边。 案例1:如果n1和n2位于不同的一侧,那么我爬到根部(距离等于节点n1的深度-假设n1位于左侧),然后向下跑到右侧节点n2(距离等于节点n2的深度)。所以
我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?
问题内容: 假设我有x1,y1,还有x2,y2。 我如何找到它们之间的距离?这是一个简单的数学函数,但是此在线代码段吗? 问题答案: dist = sqrt( (x2 - x1)2 + (y2 - y1)2 ) 正如其他人指出的那样,您也可以使用等效的内置函数:
本文向大家介绍如何打印二叉树每层的节点?相关面试题,主要包含被问及如何打印二叉树每层的节点?时的应答技巧和注意事项,需要的朋友参考一下 考察点:二叉树 实现代码:
我正在研究合并两个二叉树的问题(https://www.geeksforgeeks.org/merge-two-binary-trees-node-sum/)我很难理解一些递归。为什么要将递归语句设置为和?当你这样做的时候,是否等于两个值? 我只是不确定为什么我们要将递归语句设置为t1.leftt1.right'