【先序遍历迭代实现】LeetCode 144. Binary Tree Preorder Traversal

题目描述

在这里插入图片描述

知识点

先序遍历迭代实现

结果

在这里插入图片描述

实现

码前思考

  1. 想必二叉树先序遍历的递归写法早就写烂了。所以尝试一些使用迭代的方法去写一下遍历;
  2. 迭代通常就是指循环,我们需要设置一个栈结构来模拟递归的调用。循环的条件就是栈不为空;
  3. 由于是先序遍历,所以假设我们现在要访问根结点root,那么访问完它之后,它就没有用了,不会保存在栈中,那么它的左右子树的信息一定要保存到栈中,不然后面就找不到它左右子树信息了;
  4. 然后按照“遍历先左后右”和“栈结构的特征”,我们先将root的左子树入栈,再将root的右子树入栈。

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 //题中说尝试使用迭代的方法
 //所谓迭代就是循环,可以是for,也可以是while,都可以
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        if(root != NULL){
            st.push(root);
        }else{
            return vector<int>();
        }

        //结果数组
        vector<int> res;
         
        //只要root不是NULL,也就是不是空,我们就进行push
        while(!st.empty()){
            TreeNode* cur = st.top();
            st.pop();
            res.push_back(cur->val);
            if(cur->right!=NULL){
                st.push(cur->right);
            }
            if(cur->left!=NULL){
                st.push(cur->left);
            }
        }

        return res;
    }
};

码后反思

  1. 写的时候没有理清思路,看来清晰的思考是非常重要的,一定要把握遍历的性质进行解题,比如在这道题目里面就是要把握“根结点访问之后就没了,我们怎么保存它的左右子树信息,特别是右子树的信息?”;
  2. 忘了vector的使用方法了,如果是初始化vector,可以有两种。如果是assign操作只能是一种:
    vector(int nSize):创建一个vector,元素个数为nSize(可以不赋值)
    vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
    ------------------------------------------------------------------
    assign(int nSize,const t& t):赋值一个vector,元素个数为nSize,且值均为t
    
发布了138 篇原创文章 · 获赞 3 · 访问量 3793

猜你喜欢

转载自blog.csdn.net/yc_cy1999/article/details/105292000