2017算法课.13(Binary Tree Preoder Traversal)

来源:互联网 发布:什么是淘宝到家 编辑:程序博客网 时间:2024/06/03 21:58

题目:

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].



解析:众所周知,二叉树的遍历常规分为三种,前序遍历,中序遍历,后序遍历。这个题目是前序遍历。对于二叉树的遍历,一般采用的是递归算法,理解起来容易,但是对于遍历的效率来说,遍历效率要低很多。一般来说,可以采用递归算法的往往也可以迭代来解决,迭代的话可以利用栈来描述。下面是递归思想的算法:

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> v;
    preTraversal(root, v);
    return v;
}
void preTraversal(TreeNode* root, vector<int>& v){
    if(!root) return;//根为空,返回
    v.push_back(root->val);//把根的值放到向量v中
    preTraversal(root->left, v);//递归遍历根的左子节点
    preTraversal(root->right, v);//递归遍历根的右子节点
}


迭代法:



vector<int> preorderTraversal(TreeNode* root) {
    vector<int> v;
    if(!root) return v;
    TreeNode* temp = root;
    stack<TreeNode*> s;
    s.push(root);
    while(!s.empty()){//循环,直至栈为空
        temp = s.top();
        s.pop();//取完栈顶元素后删除顶部
        v.push_back(temp->val);
        if(temp->right) s.push(temp->right);
        if(temp->left) s.push(temp->left);
    }
}