Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在每一级连接二叉树左右分支的最内部节点_Algorithm_Tree_Language Agnostic - Fatal编程技术网

Algorithm 如何在每一级连接二叉树左右分支的最内部节点

Algorithm 如何在每一级连接二叉树左右分支的最内部节点,algorithm,tree,language-agnostic,Algorithm,Tree,Language Agnostic,想想下面这棵树。 需要一个算法来连接每一层树的左、右分支的最内部节点。 连接的意义是2->link是节点3,3->link是节点2 输入树 1 / \ 2 3 / \ / \ 4 5 6 7 / / / 8 9 10 / \ / \ 11 12 13 14 输出树 1 / \

想想下面这棵树。 需要一个算法来连接每一层树的左、右分支的最内部节点。 连接的意义是2->link是节点3,3->link是节点2

输入树

          1
        /  \
       2     3 
      / \    / \
     4   5  6   7
    /   /      /
   8   9      10 
      / \    / \
     11 12  13  14
输出树

         1
        /  \
       2=====3 
      / \    / \
     4   5==6   7
    /   /      /
   8   9======10 
      / \    / \
     11 12==13  14

你的水平顺序遍历想法很好。想象一下,对根的左子树和右子树进行水平顺序遍历,彼此独立。那么

  • 扫描左子树时在每个级别访问的最后一个节点是左子树中每个层的最右侧节点,并且
  • 扫描右子树时,在每个级别访问的第一个节点是右子树中每个层的最左侧节点
然后,您可以写下这些节点并将它们连接在一起,以获得总体结果


希望这有帮助

您的级别顺序遍历想法很好。想象一下,对根的左子树和右子树进行水平顺序遍历,彼此独立。那么

  • 扫描左子树时在每个级别访问的最后一个节点是左子树中每个层的最右侧节点,并且
  • 扫描右子树时,在每个级别访问的第一个节点是右子树中每个层的最左侧节点
然后,您可以写下这些节点并将它们连接在一起,以获得总体结果


希望这有帮助

这是一个面包优先搜索的Python实现,当两个子树中的一个子树没有更多节点时,搜索就会停止:

类节点:
定义初始化(self,value,左=无,右=无):
自我价值=价值
self.left=左
self.right=right
def儿童(自我):
如果self.left:
左撇子
如果你是对的:
让出自己的权利
def内部对(自身):
def下一级(级别):
对于级别中的节点:
来自node.children()的产量
级别=列表(self.children())
levelleft=级别[:1]
levelright=级别[1:]
而levelleft和levelright:
收益率levelleft[-1]。值,levelright[0]。值
levelleft=列表(下一级(levelleft))
levelright=列表(下一级(levelright))
使用此类,您可以根据问题创建树,如下所示:

#示例树:
树=节点(1,
节点(2,
节点(4,
节点(8)
),
节点(5,
节点(9,
节点(11),
节点(12)
)
)
),
节点(3,
节点(6),
节点(7,
节点(10,
节点(13),
节点(14)
)
)
)
)
然后按如下方式获取内部对:

print(list(tree.innerpairs())35;[(2,3)、(5,6)、(9,10)、(12,13)]

这是一个面包优先搜索的Python实现,当两个子树中的一个子树没有更多节点时,搜索就会停止:

类节点:
定义初始化(self,value,左=无,右=无):
自我价值=价值
self.left=左
self.right=right
def儿童(自我):
如果self.left:
左撇子
如果你是对的:
让出自己的权利
def内部对(自身):
def下一级(级别):
对于级别中的节点:
来自node.children()的产量
级别=列表(self.children())
levelleft=级别[:1]
levelright=级别[1:]
而levelleft和levelright:
收益率levelleft[-1]。值,levelright[0]。值
levelleft=列表(下一级(levelleft))
levelright=列表(下一级(levelright))
使用此类,您可以根据问题创建树,如下所示:

#示例树:
树=节点(1,
节点(2,
节点(4,
节点(8)
),
节点(5,
节点(9,
节点(11),
节点(12)
)
)
),
节点(3,
节点(6),
节点(7,
节点(10,
节点(13),
节点(14)
)
)
)
)
然后按如下方式获取内部对:

print(list(tree.innerpairs())35;[(2,3)、(5,6)、(9,10)、(12,13)]

欢迎使用堆栈溢出!你能告诉我们到目前为止你已经尝试了什么,什么似乎是有效的,你在哪里卡住了?当一个级别上有3个节点时会发生什么。例如,当上节点4有一个左子节点时?那么连接会是怎样的呢?如果您进行广度优先搜索,您可以得到特定级别的所有子级。从这里开始,找到内在的两个,并将它们联系起来就很简单了。当然,假设您解决了当项目数为奇数时“内部2”的含义问题。当23或56时会发生什么?@templatetypedef我尝试了级别顺序遍历,并找到了级别中所有节点与根的水平距离。然后搜索具有最小正距离和最小负距离的节点。但是,如果左分支在某个级别上向右分支交叉,则他的方法没有帮助欢迎使用堆栈溢出!你能告诉我们到目前为止你已经尝试了什么,什么似乎是有效的,你在哪里卡住了?当一个级别上有3个节点时会发生什么。例如,当上节点4有一个左子节点时?那么连接会是怎样的呢?如果您进行广度优先搜索,您可以得到特定级别的所有子级。从这里开始,找到内在的两个,并将它们联系起来就很简单了。当然,假设您解决了当项目数为奇数时“内部2”的含义问题。当23或56时会发生什么?@templatetypedef我尝试了级别顺序遍历,并找到了级别中所有节点与根的水平距离。然后搜索具有最小正距离和最小负距离的节点。但是,如果左分支向r方向交叉,他的分支也不会起作用