zoukankan      html  css  js  c++  java
  • leetcode:Binary Tree Inorder Traversal

    一、     题目

          给一个二叉树。中序遍历这个树,输出得到的值

    二、     分析

         这道题前面见到了,多次隔过去了,今天最终面对了,当时是没有好的思路。自习想想越是太难。Leetcode上的题,递归是统法啊!

          方法一:递归

             1.    开辟数组,递归左节点

             2.    将中间结点放入数组

             3.    递归有节点

         方法二:使用数组和栈

            1.    将根节点入栈

             2.    设置标志或推断条件。一直向左入栈

            3.    出栈并入数组

         基本上递归和非递归思路就是这样。非常easy的说。


    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode *root) {
            vector<int> ans;
    		inorder(root,ans);
    		return ans; 
        }
        
        void inorder(TreeNode *node,vector<int>&ans)
        {
        	if(node == NULL)
        		return;
        	inorder(node->left,ans);
        	ans.push_back(node->val);
        	inorder(node->right,ans);
        }
    };

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode *root) {
            vector<int> ans;
            stack<TreeNode *> sta;
            TreeNode *ptr = root;
            while(!sta.empty()||ptr){
            	if(ptr){
            		sta.push(ptr);
            		ptr = ptr->left;
            	}
            	else {
            		ptr = sta.top();
            		sta.pop();
            		ans.push_back(ptr->val);
            		ptr = ptr->right;
            	}
            }
    		return ans; 
        }
    };
    

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode *root) {
            vector<int> ans;
            if(!root)
            	return ans;
            stack<TreeNode *> sta;
            sta.push(root);
            while(!sta.empty()){
            	while(sta.top()->left)
            		sta.push(sta.top()->left);
                TreeNode *t = sta.top();
                ans.push_back(t->val);
                sta.pop();
                if(!sta.empty())
                	sta.top()->left = NULL;
                if(t->right) 
                	sta.push(t->right);
    		}
    		return ans; 
        }
    };
    


  • 相关阅读:
    C# 斐波拉契数列
    Visual Studio [即时窗口] & [命令窗口] (Immediate Window & Command Window) 转
    在.NET平台下 有哪些数据持久层框架 (转)
    WebPart 控件之间通讯 笔记
    WebPart的数据库连接问题 转
    C 语言函数要先声明后定义
    C#单例模式的三种写法(转)
    WCF 绑定wshttpbinding
    关于C#中派生类调用基类构造函数的理解 base使用
    ThinkPHP3.* 模型操作相关函数
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7208032.html
Copyright © 2011-2022 走看看