随笔 - 176  文章 - 0  评论 - 18  阅读 - 11万

leetcode[96] Binary Tree Inorder Traversal

给定树根root。实现中序遍历,也就是左根右。

用递归的话,很简单,左边的返回值加上root的再加上右边的就行。

我自己写的有点挫:

复制代码
/**
 * 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> lf, ri, ans;
        if (root == NULL) return ans;
        lf = inorderTraversal(root -> left);
        ri = inorderTraversal(root -> right);
        lf.push_back(root -> val);
        for (int i = 0; i < ri.size(); ++i)
        {
            lf.push_back(ri[i]);
        }
        return lf;
    }
};
复制代码

其实可以写简单一些

复制代码
class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
        vector<int> vi;
        inHelper(root, vi);
        return vi;
    }

    void inHelper(TreeNode *node, vector<int>& vi)
    {
        if(node == nullptr) return;
        inHelper(node->left, vi);
        vi.push_back(node->val);
        inHelper(node->right, vi);
    }
};
复制代码

题目要求如果不用递归的话,用如下leetcode上的,利用栈,很妙。

复制代码
vector<int> inorderTraversal(TreeNode *root) 
    {
        vector<int> rs;
        if (!root) return rs;
        stack<TreeNode *> stk;
        TreeNode *p = root;
        while (!stk.empty() || p)
        {
            if (p)
            {
                stk.push(p);
                p = p->left;
            }
            else
            {
                p = stk.top();
                stk.pop();
                rs.push_back(p->val);
                p = p->right;
            }
        }
        return rs;
    }
复制代码

 2014-12-13

复制代码
/**
 * 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> perm;
        if (root == NULL) return perm;
        stack<TreeNode *> sta;
        
        TreeNode *p = root;
        
        while(!sta.empty() || p)
        {
            while (p)
            {
                sta.push(p);
                p = p -> left;
            }
            if (!sta.empty())
            {
                p = sta.top();
                sta.pop();
                perm.push_back(p -> val);
                p = p -> right;
            }
        }
        return perm;
    }
};
复制代码

 

posted on   higerzhang  阅读(434)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示