LeetCode—Binary Tree Preorder Traversal 解题报告

来源:互联网 发布:淘宝进货的口子在哪儿 编辑:程序博客网 时间:2024/06/05 10:45

转载请注明:http://blog.csdn.net/ict2014/article/details/17500111

原题如下:



题目解析:

    这道题目是“二叉树的前序遍历”。通常有两种做法,递归求解以及循环求解。

    递归求解,较为简单,先访问当前节点、访问左孩子结点、在访问右孩子节点。详细可参照如下代码。

    循环求解,较为麻烦。但是相对于递归求解而言,这种方法耗费的函数栈空间更小,并且省去了大量的函数调用时间的开销,速度更加快,只不过程序不如递归求解的美丽客观。循环求解,需要使用一个栈保存已经访问过的数据,以便于对节点的右孩子结点进行访问。当面对一个节点的时候,我们有两种选择:

    第一:该节点不为空,访问该节点,并且压入左子树

    第二:该节点为空,抛出该点。如果当前栈不为空,则抛出一个节点,压入其右子树。


题目代码:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> preorderTraversal(TreeNode *root) {        vector<int> pre_order;        if(root == NULL){            return pre_order;        }                PreorderIterative(root, pre_order);                return pre_order;    }        //recursively implementation    void PreorderRecursive(TreeNode* root,                           vector<int>& result){        if(root == NULL){            return;        }                //visit the root node        result.push_back(root->val);        //visit left child tree        PreorderRecursive(root->left, result);        //visit right child tree        PreorderRecursive(root->right, result);    }        //iteratively implementation    void PreorderIterative(TreeNode* root,                           vector<int>& result){        if(root == NULL){            return;        }        //keep the visited nodes        stack<TreeNode*> datas;        datas.push(root);        TreeNode* top;        while(!datas.empty()){            top = datas.top();            //current node is not null            //visit the current node            if(top != NULL){                result.push_back(top->val);                datas.push(top->left);            }else{                //pop the NULL node                datas.pop();                //the stack is not empty                //pop the top visited node                //push its right child                if(!datas.empty()){                    top = datas.top();                    datas.pop();                    datas.push(top->right);                }            }        }    }};


0 0
原创粉丝点击