use*_*831 36 java tree reverse binary-tree data-structures
我正在看面试问题,最近我遇到了一个问你如何反转一般二叉树的问题,比如从右到左翻转它.
例如,如果我们有二叉树
6
/ \
3 4
/ \ / \
7 3 8 1
Run Code Online (Sandbox Code Playgroud)
扭转它会创造
6
/ \
4 3
/ \ / \
1 8 3 7
Run Code Online (Sandbox Code Playgroud)
我还没有想到如何解决这个问题的良好实现.谁能提供任何好的想法?
谢谢
Pet*_*nov 88
你可以使用递归:
static void reverseTree(final TreeNode root) {
final TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
if (root.left != null) {
reverseTree(root.left);
}
if (root.right != null) {
reverseTree(root.right);
}
}
Run Code Online (Sandbox Code Playgroud)
根据评论:
static void reverseTree(final TreeNode root) {
if (root == null) {
return;
}
final TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
reverseTree(root.left);
reverseTree(root.right);
}
Run Code Online (Sandbox Code Playgroud)
Zhi*_*ANG 14
在O(1)中反转二叉树.
struct NormalNode {
int value;
struct NormalNode *left;
struct NormalNode *right;
};
struct ReversedNode {
int value;
struct ReversedNode *right;
struct ReversedNode *left;
};
struct ReversedNode *reverseTree(struct NormalNode *root) {
return (struct ReversedNode *)root;
}
Run Code Online (Sandbox Code Playgroud)
这个问题有几个有趣的部分.首先,由于您的语言是Java,因此您最有可能拥有通用的Node 类,如下所示:
class Node<T> {
private final T data;
private final Node left;
private final Node right;
public Node<T>(final T data, final Node left, final Node right) {
this.data = data;
this.left = left;
this.right = right;
}
....
}
Run Code Online (Sandbox Code Playgroud)
其次,可以通过改变节点的左侧和右侧字段,或者通过创建与原始节点一样的新节点,但使其左右子节点"反转" 来进行反转,有时称为反转.前一种方法在另一个答案中显示,而第二种方法在此处显示:
class Node<T> {
// See fields and constructor above...
public Node<T> reverse() {
Node<T> newLeftSubtree = right == null ? null : right.reverse();
Node<T> newRightSubtree = left == null ? null : left.reverse();
return Node<T>(data, newLeftSubtree, newRightSubtree);
}
}
Run Code Online (Sandbox Code Playgroud)
不改变数据结构的想法是持久性数据结构背后的思想之一,这非常有趣.