zoukankan      html  css  js  c++  java
  • LeetCode.94

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

    For example:
    Given binary tree [1,null,2,3],

       1
        
         2
        /
       3
    

    return [1,3,2].

    Note: Recursive solution is trivial, could you do it iteratively?

      我的AC代码,递归写法比较简单,所以试试迭代:

    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            vector<int> nums;
            stack<TreeNode *> stackNode;
            while(root)
            {
                stackNode.push(root);
                if (root->left != NULL)
                {
                    root = root->left;
                    continue;
                }
                nums.push_back(root->val);
                stackNode.pop();
                if (root->right != NULL)
                {
                    root = root->right;
                    continue;
                }
    
                TreeNode * node = root;
                if (!stackNode.empty())
                {
                    root = stackNode.top();
                    root->left = NULL;
                    stackNode.pop();
                }
    
                if (node == root)
                    break;
            }
            return nums;
        }
    };
    

      利用递归栈的思路,自己维护一个栈,时间复杂度应该是O(n),空间复杂度O(n)。

      看看AC后的详细细节:

      运行时间是3ms。

      不过我也写了一个递归版的:

    class Solution {
    public:
        void helper(TreeNode* root, vector<int> & nums) {
            if (root) {
                helper(root->left, nums);
                nums.push_back(root->val);
                helper(root->right, nums);
            }
        }
        
        vector<int> inorderTraversal(TreeNode* root) {
            vector<int> nums;
            helper(root, nums);
            return nums;
        }
    };
    

      这个运行结果感觉差不多:

      完整的迭代算法:

    #include <iostream>
    #include <vector>
    #include <stack>
    
    using namespace std;
    
    class Tree {
    public:
    	int val;
    	Tree * left;
    	Tree * right;
    	Tree() : val(), left(NULL), right(NULL) {}
    	void CreateTree(Tree * &root);
    	Tree* insert(Tree * root, int x);
    	void buildTree(Tree* root, vector<int> nums);
    	void inorderTraversal(Tree * root);
    	void iterative_inorderTraversal(Tree * root);
    };
    
    void Tree::CreateTree(Tree * &root)
    {
        int val;
        cin >> val;
        if (val == -1)
            root = NULL;
        else
        {
            root = new Tree;
            root->val = val;
            CreateTree(root->left);
            CreateTree(root->right);
        }
    }
    
    Tree* Tree::insert(Tree * root, int x)
    {
    	Tree * node = new Tree;
    	node->val = x;
    
    	if (root == NULL)
        {
            root = node;
            return root;
        }
    	else if (root->left == NULL)
        {
            root->left = node;
            return root;
        }
    	else if (root->right == NULL)
        {
            root->right = node;
            return root;
        }
        else
            node->left = root;
    
    	return node;
    }
    
    void Tree::buildTree(Tree* root, vector<int> nums)
    {
    	for (auto n : nums)
    		root = insert(root, n);
    }
    
    void Tree::inorderTraversal(Tree * root)
    {
    	if (root != NULL)
    	{
    		inorderTraversal(root->left);
    		cout << root->val << ' ';
    		inorderTraversal(root->right);
    	}
    }
    
    void Tree::iterative_inorderTraversal(Tree * root)
    {
        stack<Tree *> stackNode;
        while(root)
        {
            stackNode.push(root);
            if (root->left != NULL)
            {
                root = root->left;
                continue;
            }
            cout << root->val << ' ';
            stackNode.pop();
            if (root->right != NULL)
            {
                root = root->right;
                continue;
            }
    
            Tree * node = root;
            if (!stackNode.empty())
            {
                root = stackNode.top();
                root->left = NULL;
                stackNode.pop();
            }
    
            if (node == root)
                break;
        }
    }
    
    int main()
    {
    	//vector<int> nums{ 1,2,3 };
    	Tree * root = NULL;
    	root->CreateTree(root);
    
    	//root->buildTree(root, nums);
    	root->inorderTraversal(root);
    	cout << endl;
        root->iterative_inorderTraversal(root);
    
        return 0;
    }
    

      

  • 相关阅读:
    安装一些好用的工具
    转:通过快键强制关闭 Ubuntu 上无响应的程序
    同步cm10.1源码时出现的一些错误的解决办法。
    repo sync的介绍翻译
    配置grub解决ubuntu12.04不能保存亮度和调节的问题
    给fcitx加上云拼音库
    自己安装配置ubuntu12.04过程(内容丰富)
    关于repo sync -j*的含义的猜测
    同步cm10.1的时候发生同步错误不能找到github上的文件
    Element-ui tree组件自定义节点使用方法
  • 原文地址:https://www.cnblogs.com/darkchii/p/8576029.html
Copyright © 2011-2022 走看看