94Binary Tree Inorder Traversal

来源:互联网 发布:广告终结者 mac 编辑:程序博客网 时间:2024/06/06 00:55

题目链接:https://leetcode.com/problems/binary-tree-inorder-traversal/

题目:

Given a binary tree, return the inorder traversal of its nodes' values.For example:Given binary tree {1,#,2,3},   1    \     2    /   3return [1,3,2].

解题思路:
二叉树的中序遍历,一般有两种方法:
1. 递归
2. 迭代(利用栈)
本题的考察也是想让我们利用栈来实现中序遍历。
中序遍历不同于后序遍历,不需要标记是否已遍历过左子树。

递归代码实现:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {          List<Integer> res = new ArrayList<Integer>();          helper(root, res);          return res;      }      private void helper(TreeNode root, List<Integer> res)      {          if(root == null)              return;          helper(root.left,res);          res.add(root.val);          helper(root.right,res);      }}
67 / 67 test cases passed.Status: AcceptedRuntime: 1 ms

迭代代码实现:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        if(root == null)            return new ArrayList();        LinkedList<TreeNode> stack = new LinkedList();        List<Integer> res = new ArrayList();        while(root != null || !stack.isEmpty()) {            if(root != null) {                stack.push(root);                root = root.left;            } else {                root = stack.pop();                res.add(root.val);                root = root.right;            }        }        return res;    }}
67 / 67 test cases passed.Status: AcceptedRuntime: 1 ms

下面这种方法是参考了大神的解法:http://blog.csdn.net/linhuanmars/article/details/20187257

最后我们介绍一种比较复杂的方法,这个问题我有个朋友在去 google onsite 的时候被问到了,就是如果用常量空间来中序遍历一颗二叉树。
这种方法叫 Morris Traversal
想用 O(1) 空间进行遍历,因为不能用栈作为辅助空间来保存付节点的信息,重点在于当访问到子节点的时候如何重新回到父节点(当然这里是指没有父节点指针,如果有其实就比较好办,一直找遍历的后驱结点即可)。
Morris 遍历方法用了线索二叉树,这个方法不需要为每个节点额外分配指针指向其前驱和后继结点,而是利用叶子节点中的右空指针指向中序遍历下的后继节点就可以了。

算法具体分情况如下:
1. 如果当前结点的左孩子为空,则输出当前结点并将其当前节点赋值为右孩子。
2. 如果当前节点的左孩子不为空,则寻找当前节点在中序遍历下的前驱节点(也就是当前结点左子树的最右孩子)。
接下来分两种情况:
a) 如果前驱节点的右孩子为空,将它的右孩子设置为当前节点(做线索使得稍后可以重新返回父结点)。然后将当前节点更新为当前节点的左孩子。
b) 如果前驱节点的右孩子为当前节点,表明左子树已经访问完,可以访问当前节点。将它的右孩子重新设为空(恢复树的结构)。输出当前节点。当前节点更新为当前节点的右孩子。

代码实现:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public List<Integer> inorderTraversal(TreeNode root) {          if(root == null)            return new ArrayList<Integer>();        List<Integer> res = new ArrayList();        TreeNode cur = root;        TreeNode pre = null;        while(cur != null) {            if(cur.left == null) {                res.add(cur.val);                cur = cur.right;            } else {                pre = cur.left;                while(pre.right != null && pre.right != cur)                    pre = pre.right;                if(pre.right == null) {                    pre.right = cur;                    cur = cur.left;                } else {                    pre.right = null;                    res.add(cur.val);                    cur = cur.right;                }            }        }        return res;    }  }
67 / 67 test cases passed.Status: AcceptedRuntime: 1 ms
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 门的密码输错3次怎么办 孩子剧烈运动后咳嗽到吐怎么办 前列腺穿刺后血尿一个月了怎么办 两年体检尿潜血2+怎么办严重吗? 尿结石尿不出来堵住了怎么办 四岁宝宝一直咳嗽很厉害怎么办 老公家的事业不想做了怎么办 苹果6sp手机卡顿反应慢怎么办 工程之星x3手薄密码忘了怎么办 煮绿豆汤把绿豆炒焦了怎么办 想问别人问题又不好开口怎么办 宝宝认人晚上哭着找阿姨怎么办呀 在拼多多被商家威胁了怎么办 格来云游戏禁止改画质怎么办 京东换了手机登陆要安全验证怎么办 百度网盘登录总是需要验证码怎么办 在微信群发出视频无法撤回怎么办 百度网盘客户端说网络有风险怎么办 百度网盘绑定的手机号注销了怎么办 百度网盘绑定的手机号不用了怎么办 百度网盘内存怎么清空不了怎么办 百度网盘下载时本地空间不足怎么办 百度网盘文件放到桌面太大怎么办 百度有钱花借款没有钱还怎么办 安心流量包扣了两百多钱怎么办 邮箱里超大附件的文件过期了怎么办 ps时间轴储存出现参数错误怎么办 苹果手机网易云会员支付失败怎么办 鲸钱包网络异常需重新加载怎么办 微信加载联系人失败点击重试怎么办 网易将军令没有帐号怎么绑定怎么办 网易将军令绑定银行卡锁定了怎么办 网易新闻上的视频没有声音怎么办 把登录窗体的宏删掉了怎么办 电脑死机了怎么办也不能关机了 虎牙直播手游无法和队友开麦怎么办 为成年开无手续麽托出车祸怎么办 支付宝商户未签约或合约过期怎么办 我的手机帐号被锁定了怎么办 点错网页下载收发收费信息怎么办 用邮箱注册的微信忘记密码了怎么办