博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 遍历二叉树_二叉树后续遍历的几种方式
阅读量:6655 次
发布时间:2019-06-25

本文共 2508 字,大约阅读时间需要 8 分钟。

数据结构定义:

// Definition for a binary tree node.

public class TreeNode {

int val;

TreeNode left;

TreeNode right;

TreeNode() {}

TreeNode(int val) { this.val = val; }

TreeNode(int val, TreeNode left, TreeNode right) {

this.val = val;

this.left = left;

this.right = right;

}

}

递归写法:

class Solution {

List result =new ArrayList<>();

public List postorderTraversal(TreeNode root) {

if(root == null)

return result;

if(root.left != null)

postorderTraversal(root.left);

if(root.right != null)

postorderTraversal(root.right);

result.add(root.val);

return result;

}

}

普通迭代:

class Solution {

public List postorderTraversal(TreeNode root) {

List result =new ArrayList<>();

if(root == null)

return result;

//pre的作用是记忆上一次遍历的节点,以便判断是否有右子树或右子树未遍历

TreeNode node = root,pre = null;

Stack stack =new Stack<>();

while(!stack.isEmpty() || node != null){

while(node != null){

stack.push(node);

node = node.left;

}

if((node=stack.peek()).right == null

|| node.right == pre){

pre = node;

result.add(stack.pop().val);

node =null;

}else{

pre = node;

node =node.right;

}

}

return result;

}

}

借鉴前序遍历思想:

//思路:

//前序遍历的过程是:(根-左-右)

//那么我们遍历的过程变为:(根-右-左),最后的结果再进行下倒置

//顺序就变成了:(左-右-根),完成对后序的遍历

class Solution {

public List postorderTraversal(TreeNode root) {

List result =new ArrayList<>();

if(root == null){

return result;

}

Stack stack = new Stack<>();

TreeNode node =root;

while(!stack.isEmpty() || node != null){

while(node != null){

stack.push(node);

result.add(node.val);

node = node.right;

}

node = stack.pop().left;

}

Collections.reverse(result);

return result;

}

}

莫里斯遍历:

//还是借鉴前序遍历的思路,莫里斯遍历可参看我的中序遍历一文

class Solution {

public List postorderTraversal(TreeNode root) {

List result = new ArrayList<>();

if(root == null){

return result;

}

TreeNode node =root,pre = null;

while(node != null){

if(node.right == null){

result.add(node.val);

node =node.left;

}else{

pre = node.right;

while(pre.left != null && pre.left != node){

pre = pre.left;

}

if(pre.left == null){

pre.left = node;

result.add(node.val);

node = node.right;

}else{

pre.left = null;

node =node.left;

}

}

}

Collections.reverse(result);

return result;

}

借鉴头指针插入法:

class Solution {

public List postorderTraversal(TreeNode root) {

LinkedList result =new LinkedList<>();

LinkedList stack =new LinkedList<>();

if(root == null){

return result;

}

stack.addFirst(root);

while(!stack.isEmpty()){

TreeNode node =stack.removeFirst();

result.addFirst(node.val);

if(node.left != null){

stack.addFirst(node.left);

}

if(node.right != null){

stack.addFirst(node.right);

}

}

return result;

}

}

转载地址:http://mqvto.baihongyu.com/

你可能感兴趣的文章
ACM-经典DP之Monkey and Banana——hdu1069
查看>>
数据结构---树---总结
查看>>
PTA第二次作业
查看>>
flume介绍与原理(一)
查看>>
WebStorm 10.0.3安装
查看>>
transform:rotate()将元素进行不同角度的旋转
查看>>
shell截取字符串的方法
查看>>
php Composer中国全量镜像
查看>>
SharpGL学习笔记(二) 模型变换(几何变换)
查看>>
iOS开发基础知识--碎片14
查看>>
Linux_日志信息
查看>>
Servlet容器如何同时来处理多个请求
查看>>
JMeter正则表达式-学习(3)
查看>>
关于网购心态
查看>>
09hibernate_session_flush
查看>>
ruby中文文档下载
查看>>
前端工程架构探讨
查看>>
书籍:Building Secure PHP Apps
查看>>
Oracle 查找带有CLOB字段的所有表
查看>>
KVC该机制
查看>>