zoukankan      html  css  js  c++  java
  • Binary Tree Preorder Traversal 分类: Leetcode(树) 2015-03-24 17:04 28人阅读 评论(0) 收藏

    </pre><p>Binary Tree Preorder Traversal </p>Given a binary tree, return the preorder traversal of its nodes' values.For example:Given binary tree {1,#,2,3},   1         2    /   3return [1,2,3].<p></p><p>递归版本</p><p></p><pre name="code" class="cpp">/**
     * 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> vec;
            pre(root, vec);
            return vec;
        }
        
        void pre(TreeNode *root, vector<int> &vec) {
            if (!root) return ;
            else vec.push_back(root->val);
            if(root->left) {
                pre(root->left, vec);
            }
            if(root->right) {
                pre(root->right, vec);
            }
            
        }
    };

    栈版本:

    /**
     * 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> result;
            stack<const TreeNode*> s;
            const TreeNode *p;
            
            p = root;
            if (p) s.push(p);
            
            while(!s.empty()) {
                p = s.top();
                s.pop();
                result.push_back(p->val);
                
                if (p->right) s.push(p->right);
                if (p->left) s.push(p->left);
            }
            return result;
        }
    };
    

    Mirror算法

    这个算法得特别讲解一下,这个算法的精髓可以理解为利用叶子节点的后继节点作为一个标记节点。

    伪代码:

    MirrorPreOrder()

    while 当前节点非空

    if   当前节点没有左后代

    访问当前节点

    转向当前节点的右后代节点

    else 

    找到左后代的最右节点

    if 该最右节点没有线索化

    访问当前节点

    指向当前节点

    转向当前节点左后代节点

    else

    消除线索化

    转向当前节点右后代节点

    /**
     * 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> result;
            TreeNode *cur, *prev;
            cur =root ;
            while (cur) {
                if(!cur->left) {
                    result.push_back(cur->val);
                    prev = cur;
                    cur = cur->right;
                } else {
                    TreeNode *node = cur->left;
                    while (node->right && node->right != cur) 
                        node = node ->right;
                    if (!node->right) {
                        result.push_back(cur->val);
                        node->right = cur;
                        prev = cur;
                        cur = cur->left;
                    } else {
                        node->right = NULL;
                        cur = cur->right;
                    }
                }
            }
            return result;
        }
    };




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/learnordie/p/4656948.html
Copyright © 2011-2022 走看看