LeetCode--树

Posted zhuifeng-mayi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode--树相关的知识,希望对你有一定的参考价值。

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--树的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 树 - 实现前缀树, leetcode 208

LeetCode 96. 不同的二叉搜索树 | Python

[JavaScript 刷题] 树 - 验证二叉搜索树, leetcode 98

LeetCode-235-二叉搜索树的最近公共祖先

LeetCode 把二叉搜索树转换为累加树(538)

[LeetCode]538. 把二叉搜索树转换为累加树