我刚刚遇到这个问题,并想知道我是否能提出正确的解决方案。问题涉及交换二叉树的两个节点,不仅仅是按值而是按节点。所以这意味着我们也必须改变左右值。
所以我们假设我们有一个类似上面图像的二叉树。我最初的想法是对节点进行顺序遍历,以便我可以展平树,然后只需交换元素,然后从交换列表中重构树。从字面上看,解决方案就是这样的
对于上面提到的树,inorder遍历会生成一个这样的列表,
1,3,4,6,7,8,10,13,14。
现在我换8和13。
=> 1,3,4,6,7,13,10,8,14
但这里的问题是,因为我在尝试重建时已经将树弄平了,所以我无法这样做,因为我不知道单个节点的位置,例如特定节点是左子节点还是如果是根。从字面上看,树不能像最初使用交换节点那样重新生成。
现在的问题是我是否可以修改我的遍历算法以保存每个节点的位置信息,这样当我交换元素并重建时,我想出了相同的二叉树,并且交换了所需的节点?我们可以在顺序遍历期间存储各个节点的状态/位置吗?
PS。我认识到做一个后期订单会使我的列表中的第一个和最后一个节点被交换,但是需要交换的两个节点不一定是根和最右边的元素,它可以是任何两个。
答案 0 :(得分:0)
您的问题中几乎没有含糊之处。 BST中示例中的树(虽然BST也是二叉树),最终答案可以破坏BST属性。我认为答案需要是什么。如果我错了,请纠正我。
就答案而言,有两种解决方案。
其中一个,我可以想到,在遍历和扁平化方面谈论,你不能只用一次遍历重新构建一棵树。您需要2次遍历来构建树。它可以是以下任何一个
所以在2个遍历中的任何一个上进行交换并重新构建。那应该给出答案。
第二种解决方案是一种更好,更有效的解决方案,因为Time Comp是O(n)。在此方法中,对整个树进行遍历并获取指向2个候选节点的引用指针。获得引用后,使用临时变量来交换信息。这种方法比以前的方法复杂但空间和时间都很有效。
希望这不是一个硬件问题,如果是这样,请标记它!
例如:
4
2 6
1 3 5 7
此树的顺序遍历如下所示: 上一页:4 2 1 3 6 5 7 顺序:1 2 3 4 5 6 7
现在你知道4是这棵树的根(因为root被打印为Preorder的第一个元素)。基于4现在分裂了遍历。
现在左侧的子树变成了 上一个:2 1 3;顺序:1 2 3
并且右子树变为 上一篇:6 5 7;顺序:5 6 7
继续递归,这就是答案!