zoukankan      html  css  js  c++  java
  • LeetCode OJ:Binary Tree Preorder Traversal(前序遍历二叉树)

    Given a binary tree, return the preorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3}

     1
        
         2
        /
       3

    return [1,2,3].

    前序遍历二叉树,只不过题目的要求是尽量不要使用递归,当然我还是先用递归写了一个:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<int> preorderTraversal(TreeNode* root) {
    13         ret.clear();
    14         if(root != NULL)
    15             preTrans(root);
    16         return ret;
    17     }
    18     void preTrans(TreeNode * root){
    19         ret.push_back(root->val);
    20         if(root->left != NULL) preTrans(root->left);
    21         if(root->right != NULL) preTrans(root->right);
    22     }
    23 private:
    24     vector<int> ret;
    25 };

    当然还有非递归的方法,递归那么当然要使用到stack,其实这种方法写起来有点像是java中的递归的迭代器:

     1 class Solution {
     2 public:
     3     vector<int> preorderTraversal(TreeNode* root) {
     4         vector<int> ret;
     5         if(root == NULL) return ret;
     6         stack<TreeNode*> treeStk;
     7         treeStk.push(root);
     8         TreeNode * tmpNode;
     9         while(!treeStk.empty()){
    10             tmpNode = treeStk.top();
    11             treeStk.pop();
    12             ret.push_back(tmpNode->val);
    13             if(tmpNode->left != NULL) treeStk.push(tmpNode->left);
    14             if(tmpNode->right != NULL) treeStk.push(tmpNode->right);
    15         }
    16         return ret;
    17     }
    18 };

     java版本的代码如下所示,首先是递归:

     1 public class Solution {
     2     public List<Integer> preorderTraversal(TreeNode root) {
     3         List<Integer> ret = new ArrayList<Integer>();
     4         tranversal(root, ret);
     5         return ret;
     6     }
     7     
     8     public void tranversal(TreeNode root, List<Integer> ret){
     9         if(root != null){
    10             ret.add(root.val);
    11             tranversal(root.left, ret);
    12             tranversal(root.right, ret);
    13         }
    14         return;
    15     }
    16 }

    然后是非递归的方式:

     1 public class Solution {
     2     public List<Integer> preorderTraversal(TreeNode root) {
     3         Stack<TreeNode> s = new Stack<TreeNode>();
     4         List<Integer> ret = new ArrayList<Integer>();
     5         s.push(root);
     6         while(!s.isEmpty()){
     7             TreeNode t = s.pop();
     8             if(t == null)
     9                 continue;
    10             ret.add(t.val);
    11             s.push(t.right); //注意因为使用的是栈,所以应该先push right.
    12             s.push(t.left);
    13         }
    14         return ret;
    15     }
    16 }
  • 相关阅读:
    单调栈
    【算法】验证码识别基础方法及源码
    获取安全时间
    用Cecil任意修改.Net程序集+源码
    【C#】纯托管实现一个Git服务端
    一个普通的但难以作答的面试题
    【WP7】欺骗你的地理坐标+源码
    【WP7】判断GPS坐标是否在中国
    完美的web 2.0站点用户中心标准,及开源用户中心nUserCenter进展报告
    开源 Asp.net mvc 用户中心开发计划
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4898930.html
Copyright © 2011-2022 走看看