在 java 中迭代地破坏二叉树
destroying a binary tree iteratively in java
该任务一般在递归post顺序遍历时完成,网上例子很少。其中之一是here,但我想知道它是否正确,因为_deleteTree()方法似乎只做了一个BFS而没有对节点做任何操作,删除是通过简单地将树的根设置为无效的。毫无疑问 return 一棵空树。但是删除对所有树节点的引用是正确的方法吗?
此外,对于迭代post顺序遍历,比如下面
public TreeNode postorderTraversal(TreeNode root) {
if(root==null) return null;
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
TreeNode cur=root;
stack1.push(cur);
while(!stack1.isEmpty()){
cur=stack1.pop();
if(cur!=null){
stack2.push(cur);
}
if(cur.left!=null){
stack1.push(cur.left);
}
if(cur.right!=null){
stack1.push(cur.right);
}
}
while(!stack2.isEmpty()){
//elements poped will be in post order sequence
}
return root;
}
如何迭代销毁二叉树?谁能给个示例代码(java)?谢谢!
通常,当您将节点分配给 null 时,从技术上讲,您会删除所有数据。与链接列表一样,当您通过将其 "next" per say 设置为 null 来断开其连接时,您将删除该列表,而 java 垃圾收集器将负责其余部分。因此,在您链接的 Java 代码中,一旦确定根没有 children,它们就会做同样的事情。
有一个更好的解决方案,它使用树节点本身来存储队列。像这样:
static void clear(Node root) {
while (root != null) {
Node left = root.left;
if (left == null) {
Node right = root.right;
root.right = null;
root = right;
} else {
// Rotate the left child up.
root.left = left.right;
left.right = root;
root = left;
}
}
}
该任务一般在递归post顺序遍历时完成,网上例子很少。其中之一是here,但我想知道它是否正确,因为_deleteTree()方法似乎只做了一个BFS而没有对节点做任何操作,删除是通过简单地将树的根设置为无效的。毫无疑问 return 一棵空树。但是删除对所有树节点的引用是正确的方法吗?
此外,对于迭代post顺序遍历,比如下面
public TreeNode postorderTraversal(TreeNode root) {
if(root==null) return null;
Stack<TreeNode> stack1=new Stack<>();
Stack<TreeNode> stack2=new Stack<>();
TreeNode cur=root;
stack1.push(cur);
while(!stack1.isEmpty()){
cur=stack1.pop();
if(cur!=null){
stack2.push(cur);
}
if(cur.left!=null){
stack1.push(cur.left);
}
if(cur.right!=null){
stack1.push(cur.right);
}
}
while(!stack2.isEmpty()){
//elements poped will be in post order sequence
}
return root;
}
如何迭代销毁二叉树?谁能给个示例代码(java)?谢谢!
通常,当您将节点分配给 null 时,从技术上讲,您会删除所有数据。与链接列表一样,当您通过将其 "next" per say 设置为 null 来断开其连接时,您将删除该列表,而 java 垃圾收集器将负责其余部分。因此,在您链接的 Java 代码中,一旦确定根没有 children,它们就会做同样的事情。
有一个更好的解决方案,它使用树节点本身来存储队列。像这样:
static void clear(Node root) {
while (root != null) {
Node left = root.left;
if (left == null) {
Node right = root.right;
root.right = null;
root = right;
} else {
// Rotate the left child up.
root.left = left.right;
left.right = root;
root = left;
}
}
}