All Nodes Distance K in Binary Tree

栏目: 数据库 · 发布时间: 6年前

内容简介:第8天,感觉快要把每天刷题的习惯找回来了。。。今天的题目是这道题可以分为几个部分来解决:

第8天,感觉快要把每天刷题的习惯找回来了。。。

今天的题目是 All Nodes Distance K in Binary Tree

这道题可以分为几个部分来解决:

target
target

虽说是三部分,但是在实现“寻找target节点”的时候,我们需要考虑到如何向前寻找,我们先把“向下寻找距离当前节点K步的节点”实现了。

很容易发现,这是一个递归的过程,做遍历的时候维护好K值即可,然后加一些判断条件就能实现了。

如果忽略掉“从target节点向前寻找”这个要求,我们要怎么实现寻找target节点呢?

也是一个很简单的问题,就直接用递归形式的先序遍历即可,遍历时判断当前节点是否为target节点。

现在就剩下最后一部分了,也是这道题的难点所在。

要实现向前移动,我们可以利用“寻找target节点”的一些信息,通过一个返回值来确定,是否在某个子分支中找到 target 节点:

如果找到了,我们就可以从当前节点开始向另一个分支寻找了,因为需要计算到target节点的距离,所以我们干脆把返回值设置为还需要走多少步才能到达”距离target节点K步“的位置,故:

/**
 * 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<int> distanceK(TreeNode* root, TreeNode* target, int K) {
        vector<int> res;
        if (root == nullptr || target == nullptr) return res;
        downSearch(res, target, K);
        findTarget(res, root, target, K);
        return res;
    }
    
    int findTarget(vector<int> &res, TreeNode *root, TreeNode *target, int K) {
        if (root == nullptr) return -1;
        if (root == target) return K - 1;
        
        // left
        int left_k = findTarget(res, root->left, target, K);
        if (left_k == 0) {
            res.push_back(root->val); return left_k - 1;
        } else if (left_k > 0) {
            downSearch(res, root->right, left_k-1);
            return left_k - 1;
        }
        
        int right_k = findTarget(res, root->right, target, K);
        if (right_k == 0) {
            res.push_back(root->val); return right_k - 1;
        } else if (right_k > 0) {
            downSearch(res, root->left, right_k-1);
            return right_k - 1;
        }
        return -1;
    }
    
    void downSearch(vector<int> &res, TreeNode* p, int K) {
        if (p == nullptr || K < 0) return ;
        if (K == 0) {
            res.push_back(p->val); return;
        }
        downSearch(res, p->left, K-1);
        downSearch(res, p->right, K-1);
    }
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Web Designer's Idea Book, Vol. 2

The Web Designer's Idea Book, Vol. 2

Patrick McNeil / How / 2010-9-19 / USD 30.00

Web Design Inspiration at a Glance Volume 2 of The Web Designer's Idea Book includes more than 650 new websites arranged thematically, so you can easily find inspiration for your work. Auth......一起来看看 《The Web Designer's Idea Book, Vol. 2》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具