后续遍历 java leecode

以前觉得后续遍历最难写,今天看了篇博客http://blog.csdn.net/sgbfblog/article/details/7773103,其实却是我们仔细比较后续遍历和先序遍历,其实后续遍历就是按照  根右左 的方式先序访问然后逆序就是答案了,会先序就会逆序了

leecode 的AC代码:

public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {

         ArrayList<Integer> arry=new ArrayList<Integer>();
         if(root==null) return arry;
        Stack<TreeNode> s=new Stack<TreeNode>();
        Stack<TreeNode> s2=new Stack<TreeNode>();
        s.push(root);
        while(!s.isEmpty())
        {

            TreeNode t=s.pop();
            s2.push(t);

            if(t.left!=null) s.push(t.left);
            if(t.right!=null) s.push(t.right);

        }
        while(!s2.isEmpty())
        {
            arry.add(s2.pop().val);
        }
        return arry;

    }
}

后续遍历 java leecode,布布扣,bubuko.com

时间: 2024-10-27 07:53:36

后续遍历 java leecode的相关文章

非递归实现先序遍历 java leecode 提交

写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈.2.因为栈顶的节点的左孩子为空,所以栈顶的的节点的左子树肯定访问完毕,所以出栈后直接指向右孩子.其实这里面有个思想迭代和递归的本质相同之处是什么?以后会写一篇我的思考. public class Solution { public List<Integer> preorderTraversal(T

最容易理解的二叉树后续遍历非递归java实现

后续遍历要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈.如果P不存在左孩子和右孩子,则可以直接访问它:或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点.若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问. java private static void postOrderNonRecursiveEasily(Node root) {

数据结构之中序遍历转后续遍历(JAVA实现)(二)

算法流程: 主要分为四步: 1.当前字符为数字或者字母,则直接输出 2.当前字符为),则在栈中匹配输出,一直匹配到),则停止输出(就是将)及其顶上的元素全部弹出来输出) 3.当前字符为操作符,则比较当前字符的入栈优先级(icp)和字符栈内优先级(isp),如果icp<=isp,则将栈内操作符弹出输出,然后重复3 4.当前字符为空,则将栈中元素依次弹出输出 百度百科上面的描述: 1.建立运算符栈stackOperator用于运算符的存储,压入'\0'. 2.预处理表达式,正.负号前加0(如果一个加

LeetCode 145 Binary Tree Postorder Traversal(二叉树的后续遍历)+(二叉树、迭代)

翻译 给定一个二叉树,返回其后续遍历的节点的值. 例如: 给定二叉树为 {1, #, 2, 3} 1 2 / 3 返回 [3, 2, 1] 备注:用递归是微不足道的,你可以用迭代来完成它吗? 原文 Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recur

树的前中序遍历_求后续遍历

原文链接:http://blog.csdn.net/feliciafay/article/details/6816871 PreOrder:         GDAFEMHZ InOrder:           ADEFGHMZ PostOrder:       AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历? 第一步,root最简单,前序遍历的第一节点G就是root.

【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal-通过中序和后续遍历还原二叉树

一.描述: 二.思路: 二叉树的中序遍历和前序遍历或和后续遍历能唯一确定一节课二叉树,即2中还原方式都需要中序遍历才能完成: 设二叉树的前序遍历序列为{1, 2, 4, 5, 3, 6},中序遍历序列为{4,2,5,1, 3, 6}:(红色标记表示以还原节点!!!) (1)-前序遍历的第一个节点是二叉树的根节点,{1, 2, 4, 5, 3, 6},对应中序中的位置是{4,2,5,1, 3, 6},所以中序序列中的 '1' 之前的全部元素为左子树元素,'1'之后的为右子树元素: (2)-左子树对

算法基础 - 通过前序遍历和中序遍历得到后续遍历

思想 思想很简单,前序遍历,第一个节点一定是当前树的根节点,而这个节点在中序遍历中,分割了左右子树. 假如前序: root left1 left2 left3 right1 right2 中序一定是: left left left root right right 虽然left在中序的顺序不能直接通过前序得到,但是一定知道的是,在中序遍历中,root分割了左右子树.然后递归得到左右子树的遍历,就可以得到整个树了. 代码如下: #include <iostream> #include <c

已知二叉树的先序,中序遍历,求后续遍历

//已知二叉树的先序,中序遍历,求后续遍历 struct TreeNode { char elem; struct TreeNode* left; struct TreeNode* right; }; TreeNode* BinaryTree(char* inorder,char* preorder,int length) { if(length == 0) return NULL; TreeNode* node = new TreeNode; node->elem = *preorder; i

二叉树的后续遍历序列

代码: #include <iostream> #include <vector> #include <assert.h> using namespace std; bool verifyBst(int data[],int length){ if(data == NULL || length <=0) return true; int root = data[length - 1]; int i=0; //查找左子树节点和长度 左子树小于根节点 for(;i &