二叉树的相关操作(持续更新)

来源:互联网 发布:刷火车票的软件 编辑:程序博客网 时间:2024/05/18 02:41

1.二叉树非递归遍历遍历

(1)前序遍历思路(Binary Tree Preorder Traversal)

Tree root;//传入的树stack s;//用来存储所有根节点的栈list result;//存储遍历结果//树遍历过程while(!s.isEmpty || root != null){//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)while(root != null){s.push(root);result.push(root.val);//处理遍历结果root=root.left;}//出栈root = s.pop().right; //继续循环入栈}

(2)中序遍历思路(Binary Tree Inorder Traversal)

<pre name="code" class="java">Tree root;//传入的树stack s;//用来存储所有根节点的栈list result;//存储遍历结果//树遍历过程while(!s.isEmpty || root != null){//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)while(root != null){s.push(root);root=root.left;}//出栈root = s.pop(); //出栈操作result.push(root.val);//处理遍历结果root=root.right;<span style="white-space:pre"></span>//继续循环入栈}
(3)后续遍历思路(Binary Tree Postorder Traversal)

Tree root;//传入的树stack s;//用来存储所有根节点的栈list result;//存储遍历结果Tree temp = null;//用来临时存储树节点,判断是否是树的右孩子//树遍历过程while(!s.isEmpty || root != null){//将树的所有根节点入栈(每个节点都可看作一棵树的根节点)while(root != null){s.push(root);root=root.left;}//出栈root = s.peek().right;if(root == null || root == temp){temp = s.pop();result.add(temp.val);root = null;if(!s.isEmpty()){if(temp != s.peek().right)root = s.peek().right;else{temp = s.pop();result.add(temp.val);}}}}

总结: 对于前序遍历,就是循环入栈,在入栈时对该节点进行处理;然后栈顶元素出栈,指针指向当前栈顶元素的右孩子继续循环入栈。

对于中序遍历,就是循环入栈;然后栈顶元素出栈,在出栈时对该节点进行处理,指针指向当前栈顶元素的右孩子继续循环入栈。

对于后序遍历,同样循环入栈;判断栈顶元素的右孩子是否是为空,如果为空则栈顶元素出栈,并对该节点进行处理;判断出栈的节点是否为栈顶节点的右孩子节点,若为右孩子继续出栈,否则指针指向当前栈顶元素的右孩子继续循环入栈。






0 0
原创粉丝点击