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);
    }
};

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

查看所有标签

猜你喜欢:

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

云计算安全与隐私

云计算安全与隐私

Tim Mather、Subra Kumaraswamy、Shahed Latif / 刘戈舟、杨泽明、刘宝旭 / 机械工业出版社华章公司 / 2011-6 / 65.00元

《云计算安全与隐私》可以使你明白当把数据交付给云计算时你所面临的风险,以及为了保障虚拟基础设施和网络应用程序的安全可以采取的行动。本书是由信息安全界知名专家所著,作者在书中给出许多中肯的忠告和建议。本书的读者对象包括:IT职员、信息安全和隐私方面的从业人士、业务经理、服务提供商,以及投资机构等。阅读本书你会了解直到现在还严重匮乏的云计算安全方面的详尽信息。 《云计算安全与隐私》主要内容包括:......一起来看看 《云计算安全与隐私》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具

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

RGB CMYK 互转工具