经典算法前序遍历二叉树

1、题目描述
给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]
1

2
/
3

输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

2、我的代码
/**

  • Definition for a binary tree node.

  • struct TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    class Solution {
    public:
    vector preorderTraversal(TreeNode
    root) {
    TreeNode* cur_node;
    if(root == NULL)
    return result_vec;

     result_vec.push_back(root->val);
     preorderTraversal(root->left);
     preorderTraversal(root->right);
    
     return result_vec;
    

    }
    vector result_vec;
    };

使用stack
/**

  • Definition for a binary tree node.

  • struct TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    class Solution {
    public:
    vector preorderTraversal(TreeNode
    root) {
    TreeNode* cur_node;
    stack<TreeNode*> stack_node;
    TreeNode* pre_node;

     if(root == NULL)
         return result_vec;
     cur_node = root;
     while(cur_node != NULL || !stack_node.empty()){
         if(cur_node == NULL){
             cur_node = stack_node.top();
             stack_node.pop();
         }
         result_vec.push_back(cur_node->val);
         if(cur_node->right != NULL)
             stack_node.push(cur_node->right);
         cur_node = cur_node->left;
     };
    
     return result_vec;
    

    }
    vector result_vec;
    };
    3、网上较好的解法
    莫里斯算法逻辑并不清晰,但可能省存储空间
    4、自己可以改进的地方
    a、利用stack的方法,执行效率并不高,逻辑设计的不对
    b、
    5、优化代码至简无可简(效率击败:63%,内存击败:100%)
    /**

  • Definition for a binary tree node.

  • struct TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    class Solution {
    public:
    vector preorderTraversal(TreeNode
    root) {
    TreeNode* cur_node;
    stack<TreeNode*> stack_node;
    TreeNode* pre_node;

     if(root == NULL)
         return result_vec;
     cur_node = root;
     stack_node.push(cur_node);
     while(!stack_node.empty()){
         cur_node = stack_node.top();
         stack_node.pop();
         result_vec.push_back(cur_node->val);
         if(cur_node->right != NULL)
             stack_node.push(cur_node->right);
         if(cur_node->left != NULL)
             stack_node.push(cur_node->left);
     };
    
     return result_vec;
    

    }
    vector result_vec;
    };
    6、获得的思考
    遍历顺序不一样时,入stack的逻辑是不同的,否则会影响逻辑清晰度甚至是执行效率

发布了4 篇原创文章 · 获赞 0 · 访问量 22

猜你喜欢

转载自blog.csdn.net/digitaluser/article/details/105617352