复习一下二叉树的各种遍历
前序遍历:根节点->左节点->右节点
中序遍历:左节点->根节点->右节点
后序遍历:左节点->右节点->根节点
样例
给出二叉树 {1,#,2,3}
,
1 2 / 3
返回 [1,3,2]
.
首先还是一样对于二叉树这个结构来说我们用的最多和最容易想到的方法就是递归
下面给出了java的递归版:
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /* * @param root: A Tree * @return: Inorder in ArrayList which contains node values. */ public List<Integer> inorderTraversal(TreeNode root) { List<Integer> targetList = new LinkedList(); if(root == null) return targetList; targetList.addAll(inorderTraversal(root.left)); targetList.add(root.val); targetList.addAll(inorderTraversal(root.right)); return targetList; } }
上面的代码利用了java的util包下面的LinkedList类 addAll方法就是将另一个集合里面的元素全部都吸收放到自己里面。
递归这个方法非常容易想就是不停的调用自己
然后我自己想了一下怎么用非递归去实现,没有思路,然后上网上查了一些方法,看了之后才晓得懂得巧妙地利用各种数据结构才是最厉害的
非递归方式就是利用堆栈这种数据结构来实现
""" Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None """ class Solution: """ @param: root: A Tree @return: Inorder in ArrayList which contains node values. """ def inorderTraversal(self, root): targetList = []#创建目标list tempList = []#创建中转存储list p = root while len(tempList)!=0 or p is not None:#判断temp是否有元素 还有p是否是空 if p is not None:#判断左节点是否为空 tempList.append(p)#不为空则将当前根节点放入到temp临时list里 p = p.left else:#如果左边的已经走完了 p = tempList.pop()#出栈并将出栈的结果付给p(根节点) targetList.append(p.val)#将p的值放进结果list p = p.right#继续遍历p的右子树,按照上述方法再来一遍 return targetList
上述代码借鉴了 http://blog.csdn.net/zhangxiangdavaid/article/details/37115355 这篇博客