博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[二叉树专题]求二叉树的前中后遍历(递归,迭代)
阅读量:6083 次
发布时间:2019-06-20

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

hot3.png

/* 前序递归遍历1. 如果二叉树为null,则直接返回2. 如果二叉树不为null,先访问根节点再访问左子树,最后访问右子树*/public static void preorderTraversalRec(TreeNode root){    if(root == null){        return ;    }    System.out.print(root.val + " ");    preorderTraversalRec(root.left);    preorderTraversalRec(root.right);}/*前序迭代遍历用一个辅助stack,总是把右孩子放进栈。*/public static void preorderTraversal(TreeNode root){    if(root == null)        return null;        Stack
 stack = new Stack
();    stack.push(root);        while(!stack.isEmpty()){        TreeNode cur= stack.pop();        System.out.print(cur.val + " ");                //关键点:先压入右孩子,再压入左孩子,这样在出栈的时会先打印左孩子,再打印右孩子。        if(cur.right != null){            stack.push(cur.right);        }        if(cur.left != null){            stack.push(cur.left);        }    }  }/*中序递归遍历1。如果二叉树为null,则直接返回2. 如果二叉树不为null,则先访问左子树,再访问根节点,最后访问右子树。*/public static void inorderTravelsalRec(TreeNode root){    if(root == null){        return ;    }        inorderTravelsalRec(root.left);    System.out.print(root.val + " ");    inorderTravelsalRec(root.right);}/*中序迭代遍历用栈先把根节点的所有左孩子都添加到栈内,然后输出栈顶元素,再处理栈顶元素的右子树*/publiv static void inorderTravelsal(TreeNode root){    if(root == null){        return ;    }    stack
 stack = new Stack
();    TreeNode cur = root;    while(true){        while(cur != null){ //先添加所有的左孩子到栈内            stack.push(cur);            cur = cur.left;         }         if(stack.isEmpty()){             break;         }                  //因为此时已经没有左孩子,所以输出栈顶元素         cur = stack.pop();         System.out.print(cur.val + " ");         cur = cur.right;    }}/*后序递归遍历1.如果二叉树为null,则直接返回;2.如果二叉树不为null,先访问左子树,再访问右子树,最后访问根节点*/public static void postorderTravelsalRec(TreeNode root){    if(root == null){        return ;    }        postorderTravelsalRec(root.left);    postorderTravelsalRec(root.right);    System.out.print(root.val + " ");}/*后序迭代遍历*/public static void postorderTravelRec(TreeNode root){    if(root == null){        return ;    }        Stack
 s = new Stack
();//第一个stack用于添加node和他的左右孩子    Stack
 output = new Stack
();//第二个stack用于翻转第一个stack输出        s.push(root);    while(!s.isEmpty()){        TreeNode cur = s.pop();        output.push(cur); //把栈顶元素添加到第二个stack                if(cur.left != null){            s.push(cur.left);        }        if(cur.right != null){            s.push(cur.right);        }                while(!output.isEmpty()){//遍历输出第二个stack,即为后序遍历            System.out.print(output.pop().val + " ");        }    } }

转载于:https://my.oschina.net/u/2477353/blog/662981

你可能感兴趣的文章
[转] PostgreSQL学习手册(数据表)
查看>>
HDU-1159 Common Subsequence(动态规划2)
查看>>
spl_autoload_register更改框架文件引用模式
查看>>
diff文件生成小记
查看>>
RN中有两种方式使用全局变量
查看>>
处理 Oracle SQL in 超过1000 的解决方案
查看>>
maven项目在eclipse的library中没有Maven Dependencies
查看>>
RN初始化环境快速配置
查看>>
10.Lambda表达式入门
查看>>
maven jar 导入本地仓库
查看>>
ExtentTestNGIReporterListener
查看>>
UIView
查看>>
Layer Filters
查看>>
微信小程序 解决 数字粗细不一 的bug
查看>>
mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
查看>>
FJ省队集训最终测试 T2
查看>>
PHP csv文件内容转成数组/Json
查看>>
[结题报告]11479 - Is this the easiest problem? Time limit: 1.000 seconds
查看>>
php中使用linux命令四大步骤
查看>>
neo4j安装与示例
查看>>