剑指offer---二叉树(1)

二叉搜索树的第k个节点_牛客题霸_牛客网 (nowcoder.com)

题目内容一句话概括,就是把二叉树排序好后的节点,返回第k个节点。

思路:

        遍历二叉树,由于是二叉搜索树,所以,如果按照中序输出的话,就是一个有序的节点顺序(小到大)。那么我们就按照中序输出的方式,遍历到哪个节点就给他标号,找到我们要找的号码,返回输出就行。

class Solution {
public:
    int ss=0;  //节点值的号码数
    int nn=1;  //要找的号码数
    int res=-1;
    void traverse(TreeNode* root)
    {
        if (root==nullptr) return ;
 
        traverse(root->left);        
        ss++;
        if (ss == nn)  res = root->val;    //记录下节点值
        traverse(root->right);
 
    }
 
    int KthNode(TreeNode* proot, int k) {
        nn = k;
        traverse(proot);
        return res;
    }
};

还有另外一种方法,即用栈模拟的方式来遍历二叉树。我们先把左子树遍历完,再去把其他部分的节点进行遍历。

class Solution {
public:
    int KthNode(TreeNode* proot, int k) {
        if (proot==nullptr) return -1;
 
        int nn=0;       //标记每个节点的顺序
        stack<TreeNode*> ss;   
        TreeNode* ptr = nullptr;
 
        while (!ss.empty() || proot!=nullptr){
            while (proot!=nullptr)
            {
                ss.push(proot);        //把左子树全部入栈
                proot = proot->left;
            }
            ptr = ss.top();            //再处理右子树(这样的顺序满足从小到达的要求)
            ss.pop();
            nn++;
            if (nn == k) return ptr->val;    //找到即返回
 
            proot = ptr->right;
        }
         
    return -1;
    }
};

二叉树的深度_牛客题霸_牛客网 (nowcoder.com)

 

与上题一样也有两种方法

模拟遍历与递归遍历。

直接给出代码:

class Solution {
public:
    int TreeDepth(TreeNode* pRoot) {
        if (pRoot==nullptr) return 0;
 
        int depth=0;
        queue<TreeNode*> que;
        que.push(pRoot);
         
        while (!que.empty())
        {
            int size = que.size();  //这层有几个节点
            for (int i=0;i<size;i++) //进入下一层
            {
                TreeNode* qq = que.front(); //弹出上层节点
                que.pop();
 
                if (qq->left) que.push(qq->left);
                if (qq->right) que.push(qq->right);
            }
            //这层搞完深度加1
        depth++;
        }
    return depth;
    }
};

下面的方法是用了回溯的思想,具体可以参考:二叉树以及多叉树一些小技巧-CSDN博客

class Solution {
public:
    int res=0;
    int depth=0;
    void traverse(TreeNode* root)
    {
        if (root==nullptr) return;
 
        depth++;                
        res  = max(res,depth);
        traverse(root->left);
        traverse(root->right);
        depth--;
    }
 
    int TreeDepth(TreeNode* pRoot) {
        if (pRoot==nullptr) return 0;
        traverse(pRoot);
        return res;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值