Tree in Leetcode

105. 从前序与中序遍历序列构造二叉树

class Solution {
public:
//用全局变量进行绑定元素这样避免了在函数中进行参数的传递,会稍微简单一些, vector
<int> pre; vector<int> in; TreeNode*build(int st1, int ed1, int st2, int ed2) { //边界条件判断 自己手动画一画, if(st1 > ed1) // st1-ed1== 1 这样也是可以通过的,自己画一下就看出来了边界条件 { //cout << "st1 > ed1 || st2 > ed2"<< endl; return NULL; } //要用堆上的空间,不要用栈上的空间 TreeNode * r = new TreeNode(pre[st1]);
// 如果就一个元素就直接返回就行了,其实不写也行,因为下面的递归也已经包含了
if(st1 == ed1) { //cout<< "st1 == ed1"<< endl; return r; } int find= -1;
//[]用的是比区间,不要左闭右开写惯了,会有bug
for(int i=st2; i<=ed2; ++i) { if(in[i] == r->val) { find = i; break; } }
if(find == -1)
return -1;
int c = find - st2; r->left = build(st1+1, st1+c, st2, find-1); r->right = build(st1+c+1, ed1, find+1, ed2); return r; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { pre = preorder; in = inorder; TreeNode* r = build(0,pre.size()-1, 0, in.size()-1); return r; } };

144. 二叉树的前序遍历

class Solution {
public:
    vector<int> ans;
// 递归代码
/* void previsit(TreeNode* r) { if(r != NULL) { ans.push_back(r->val); previsit(r->left); previsit(r->right); } }*/
// 非递归代码
void previsit(TreeNode* r) { stack<TreeNode*> s; s.push(r); while(!s.empty()) { r= s.top(); s.pop(); if(r!=NULL) { ans.push_back(r->val); s.push(r->right); s.push(r->left); } } } vector<int> preorderTraversal(TreeNode* root) { ans.clear(); previsit(root); return ans; } };

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9193977.html