码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode--树

时间:2019-07-16 11:02:54      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:前序遍历   最短路   level   pre   roo   top   evel   root   end   

1、给定二叉树,找到它的最小深度。最小深度是从根节点到最近叶节点的最短路径上的节点数。

class Solution {
public:
    int run(TreeNode *root) {
        if(!root) return 0;
        queue<TreeNode*> qu;
        TreeNode *last;
        TreeNode *now;
        int level=1;
        int size;
        last = now = root;
        qu.push(root);
        while(qu.size()){
            now = qu.front();
            qu.pop();
            size = qu.size();
            if(now->left) qu.push(now->left);
            if(now->right) qu.push(now->right);
            if(qu.size()-size ==0) break;
            if(last == now){
                level++;
                if(qu.size()) last = qu.back();
            }
        }
        return level;
    }
};

2、给定二叉树,返回其节点值的后序遍历。

例如:
给定二叉树{1,#,2,3},

   1
    \
     2
    /
   3

返回[3,2,1]。

注意:递归解决方案很简单,你可以迭代地做吗?

思路:

前序遍历 根->左->右 变成 根->右->左 结果再reverse一下

/**
 * 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> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if(!root) return res;
        stack<TreeNode *> st;
        st.push(root);
        while(st.size()){
            TreeNode *temp = st.top();
            st.pop();
            res.push_back(temp->val);
            if(temp->left) st.push(temp->left);
            if(temp->right) st.push(temp->right);
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

3、给定二叉树,返回其节点值的前序遍历。

例如:
给定二叉树{1,#,2,3},

   1
    \
     2
    /
   3

返回[1,2,3]。

注意:递归解决方案很简单,你可以迭代地做吗?

思路:

非递归方式求前序遍历

首先找根节点的左孩子,如果有则放入开辟好的栈里,若没有则找他的右孩子,

若此时没有其右孩子,则返回它的父节点,观察其是否有右兄弟,以此类推

/**
 * 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> res;
        if(!root) return res;
        stack<TreeNode*> st;
        TreeNode *p = root;
        while(!st.empty() || p!=NULL){
            if(p!=NULL){  //如果有左孩子
                res.push_back(p->val); //将值放入到开辟好的容器中
                st.push(p); //将其放入栈中
                p = p->left; //继续找左孩子
            }else{
                p = st.top(); //找到当前栈中的最上层的节点
                st.pop(); //删除该节点
                p = p->right;  // 看这个节点是由由右孩子
            }
        }
        return res;
    }
};

 

LeetCode--树

标签:前序遍历   最短路   level   pre   roo   top   evel   root   end   

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/11193172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!