题意:前序遍历二叉树
前序遍历 根->左子树->右子树
先递归解法:
class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int>res; position(root, res); return res; } void position(TreeNode *root, vector<int> &res){ if (root){ res.push_back(root->val); position(root->left, res); position(root->right, res); } } };
非递归方法:
在了解非递归之前,我们先了解一下递归在计算机中是怎样实现的。
递归,说白了就是将函数指针放入栈中!然后根据先进后出的原则进行递归!
其实非递归方法就是在模拟递归方法!想一下!如何将遍历到左子树之后又如何遍历到右子树呢?
而且,当遍历到左子树又向下遍历,遍历完最底层后发现需要遍历当前根的右子树,是不是需要记住父节点。那么你可以思考一下
递归的方法是不是相当于有了这样的一个思路来保存父节点!那依次类推,我们就用一个栈去保存父节点就好了。
特别值得注意的是,当你访问的顺序是 左子树->右子树;由于栈的先进后出的原则就变成了 右子树<-左子树!
class Solution { public: vector<int> preorderTraversal(TreeNode *root) { vector<int>res; stack<TreeNode *>s; if (root == NULL){ //空树 return res; } s.push(root); //放树根 while (!s.empty()){ TreeNode *cc = s.top(); s.pop(); res.push_back(cc->val); //访问根 if (cc->right != NULL){ s.push(cc->right); } if (cc->left != NULL){ s.push(cc->left); } } return res; } };
兄弟题!
实现后序遍历
递归法:略
非递归法:
class Solution { public: vector<int> postorderTraversal(TreeNode *root) { vector<int>res; stack<TreeNode *>ss; if (root == NULL)return res; ss.push(root); while (!ss.empty()){ TreeNode *cc = ss.top(); ss.pop(); res.push_back(cc->val); if (cc->left){ ss.push(cc->left); } if (cc->right){ ss.push(cc->right); } } reverse(res.begin(), res.end()); return res; } };
日语