第十四周算法分析与设计: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].
Note: Recursive solution is trivial, could you do it iteratively?

问题出自此处


解法思路:
1.递归:看见遍历不由自主想到了递归,先序遍历就是先遍历根节点,再遍历左右节点。一开始不懂#是啥意思,以为val用这个字符代表没有子树,然后转念一想不对啊,val的数据类型是int,不可能存得了这个,所以这个应该就是空指针的意思!

class Solution {
private:
    vector<int> result;
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if(root == NULL) return result;     
        result.push_back(root->val);
        preorderTraversal(root->left);
        preorderTraversal(root->right);
        return result;

    }
};

嘛,这个就是 O(N) 的时间复杂度啦。

2.循环。惊了!准备写博客的时候才发现题目要求用迭代?!害我终于以为自己可以用个迭代解决中等难度题时白白暗爽了一波!好吧,进入正题,在迭代中遍历,可以使用栈来帮助解决——不过要注意的是:先取数,再弹出该节点(以免重复算);然后先进栈右节点,再进栈左节点。(保证下次循环栈顶取出的是左节点)

class Solution {
private:
    vector<int> result;
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if(root == NULL) return result;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty()) {
            TreeNode* cur = st.top();
            result.push_back(cur->val);
            st.pop();
            if(cur->right) st.push(cur->right);
            if(cur->left) st.push(cur->left);

        }
        return result;

    }
};

这个时间复杂度也是 O(N) ~
+1s~
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值