leetcode------863. 二叉树中所有距离为 K 的结点

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

输出:[7,4,1]

解释:
所求结点为与目标结点(值为 5)距离为 2 的结点,
值分别为 7,4,以及 1



注意,输入的 "root" 和 "target" 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。

提示:

  1. 给定的树是非空的,且最多有 K 个结点。
  2. 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
  3. 目标结点 target 是树上的结点。
  4. 0 <= K <= 1000.

解决的关键是将由根节点到target全部装入一个数组,如果目标需要向下找K个,那么目标的父亲需要向下找K-1个,类似的目标的父亲的父亲需要向下找K-2个,以此类推。另外需要注意的是目标的父亲不能来目标所在的分支找,比如图例中,如果节点3向下找(2-1)个,那么就是5,但是5明显不对。这一点必须考虑到。

/**
 * 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:

        int N;
        bool isstop=false;
        vector<int> res;
        int KK;
        vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
            st.resize(600);

            dfsSearch(root, target,0); //将根到目标所经过的点全部装入st。 
            st.resize(N);
            int last=min(N,K+1);
            for(int i=0; i<last; i++)
            {
                cout<<st[N-i-1]->val<<" "<<K-i<<endl;
                dfsAdd(st[N-i-1],0,K-i);  // 对于每个点,向下找k-1 
            }
            return res;
        }

        void dfsAdd(TreeNode* root,int cur,int k)
        {
            if(cur!=0)  //如能来这个路径上找 
            {
                if(find(st.begin(),st.end(),root)!=st.end())
                {
                    return ;
                }

            }
            if(cur==k&&root!=NULL)
            {
                res.push_back(root->val);
            }

            else
            {
                if(root!=NULL&&root->left!=NULL)
                {
                    dfsAdd(root->left, cur+1,k);
                }
                if(root!=NULL&&root->right!=NULL)
                {
                    dfsAdd(root->right,cur+1,k);
                }
            }

        }

        void dfsSearch(TreeNode* root, TreeNode* target,int level)
        {
            TreeNode* p=root;
            if(isstop) return;
            if(p==target)
            {
                st[level]=p;
                N=level+1;
                isstop=true;
                return;
            }
            else
            {
                st[level]=p;
                if(p!=NULL&&p->left!=NULL)
                {
                    dfsSearch(p->left, target,level+1);
                }
                if(p!=NULL&&p->right!=NULL)
                {
                    dfsSearch(p->right, target,level+1);
                }
            }
        }
        vector<TreeNode*> st;

};

 

<think>首先,用户提到了“编号2201”,但我没有之前的上下文。从系统指令看,我应该参考用户上一次的问题我的回答。但在这次对话中,这是用户的第一条消息,所以我必须基于当前信息。 用户说:“我想查找关于编号2201与二叉树结点查找方面问题(如算法实现) 请问编号2201对应的问题中关于二叉树结点查找方法及实现思路”。这看起来像是用户在引用一个编号“2201”,可能是一个问题编号或代码标识符。但由于没有历史,我需要假设这个编号是特定的,或者用户可能在询问关于二叉树的一般知识。 系统指令说:“参考站内引用:。上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。” 但既然这是第一条消息,我没有“上一次的问题回答”。所以我应该直接回答用户的问题。 用户的核心问题是:查找关于“编号2201”与二叉树结点查找方面的内容,特别是算法实现。既然“编号2201”可能是一个特定标识,我需要假设它可能是一个问题或代码,但如果没有上下文,我应该提供关于二叉树结点查找的一般信息。 用户说:“编号2201对应的问题中关于二叉树结点查找方法及实现思路”,所以或许在用户的心中,“2201”是指一个特定的问题编号。例如,在一些在线平台如LeetCode,问题有编号。2201可能是一个LeetCode问题号。 让我快速检查:LeetCode 2201是什么?根据我的知识,LeetCode问题编号2201是“Count Artifacts That Can Be Extracted”,这与考古网格相关,不是二叉树。但用户提到了二叉树结点查找,所以可能不是那个。或许是另一个系统中的编号。 为了安全起见,我应该提供关于二叉树结点查找的通用信息,因为用户指定了“二叉树结点查找方法及实现思路”。 此外,系统指令要求: - 使用中文回答。 - 行内数学表达式用$...$。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证真实可靠。 最后,生成相关问题。 所以,结构: 1. 解释二叉树结点查找。 2. 描述方法:如深度优先搜索(DFS)、广度优先搜索(BFS)。 3. 给出实现思路代码示例。 4. 生成相关问题。 由于用户提到“编号2201”,我应该承认这个,但由于没有上下文,提供一个通用的回答。 或许用户错误引用了编号。或者在某些上下文中,2201是二叉树的某种表示。但更可能的是,用户想询问二叉搜索树(BST)中的查找,因为这是常见的。 标准二叉树查找通常涉及搜索特定节点,可能是通过值或位置。 在二叉搜索树中,查找是高效的。 所以,我会围绕二叉搜索树查找来回答。 步骤: 1. **介绍**:解释二叉树结点查找是什么。 2. **方法**: - 在普通二叉树中:使用DFS或BFS遍历。 - 在二叉搜索树中:利用有序性质进行高效查找。 3. **实现思路**: - 递归或迭代方法。 - 代码示例:用Python或类似语言。 4. **添加引用**:如果需要,添加引用标识。既然没有具体引用,我可以用通用知识。 5. **生成相关问题**:在结束时。 用中文。 首先,回答用户的问题。 开始:"关于您提到的编号2201,我没有具体的上下文信息,但如果您是在询问二叉树结点查找的通用方法及实现,我可以提供相关信息。二叉树结点查找通常涉及在二叉树中搜索特定值的节点。" 然后,解释二叉树查找。 详细步骤。 **二叉树结点查找方法**: - 在普通二叉树(无序)中:需要遍历整个树,使用深度优先搜索(DFS),如前序、中序、后序,或广度优先搜索(BFS)。时间复杂度为$O(n)$,其中$n$是节点数。 - 在二叉搜索树(BST)中:树是有序的,左子树所有节点值小于根,右子树所有节点值大于根。查找类似二分搜索,时间复杂度为$O(h)$,其中$h$是树高,最坏情况$O(n)$(不平衡树),平均$O(\log n)$。 **实现思路**: - BST查找递归实现: - 如果树为空,返回null。 - 如果目标值等于当前节点值,返回当前节点。 - 如果目标值小于当前节点值,递归查找左子树。 - 否则,递归查找右子树。 - 迭代实现类似,使用循环。 代码示例:用Python。 生成相关问题。 添加引用:由于是通用知识,或许不需要具体引用,但系统说"末尾自然地添加引用标识",所以可能加一个通用引用如[^1]。 引用什么?或许说"基于二叉树的标准算法[^1]",但最好具体。 在示例中,快速排序有引用[^1]。 所以,我可以添加类似。 最终回答结构: - 解释。 - 方法描述。 - 代码块。 - 相关问题。 代码格式:用```包围。 现在,撰写。 </think> 关于您提到的编号2201(可能指特定问题或系统中的标识符),我没有直接的上下文信息(如历史对话或具体问题详情)。但如果您是在询问二叉树结点查找的通用方法及实现思路(常见于算法问题如二叉搜索树遍历),我可以提供详细解释。二叉树结点查找的目标是在树结构中搜索特定值或条件的节点,其核心方法取决于二叉树类型:普通二叉树(无序)需遍历整个树,而二叉搜索树(BST)则利用有序性质实现高效查找。下面我将逐步解释方法、实现思路,并提供代码示例,确保内容真实可靠(基于经典算法教材如《算法导论》[^1])。 ### 二叉树结点查找方法 在二叉树中查找结点,主要有两种常见方法: 1. **普通二叉树(Unordered Binary Tree)查找**: - 由于节点无序,必须遍历整个树来搜索目标值。 - **深度优先搜索(DFS)**:递归或迭代遍历子树,包括前序(根--右)、中序(左--右)、后序(左--根)顺序。时间复杂度为$O(n)$($n$为节点数),空间复杂度为$O(h)$($h$为树高)。 - **广度优先搜索(BFS)**:使用队列层序遍历,适合查找最近节点。时间复杂度同样为$O(n)$,空间复杂度为$O(w)$($w$为树的最大宽度)。 2. **二叉搜索树(BST)查找**: - BST 是一种有序二叉树,满足:左子树所有节点值 $\leq$ 根节点值 $\leq$ 右子树所有节点值。 - 查找类似二分搜索:从根节点开始,比较目标值与当前节点值,递归进入左子树(目标值小)或右子树(目标值大)。时间复杂度为$O(h)$,平均情况下(树平衡)为$O(\log n)$,最坏情况(树退化为链表)为$O(n)$。 - 优势:高效查找,适用于动态数据集[^1]。 ### 实现思路 实现二叉树结点查找的关键是选择合适的数据结构遍历策略。以下是针对 BST 的查找实现思路(因其高效性更常见于问题如“编号2201”可能涉及的场景): - **递归方法**:思路简单,代码易读,但递归深度可能导致栈溢出(大树上)。 - **迭代方法**:使用循环代替递归,节省栈空间,更适合大型树。 - 通用步骤: 1. 若树为空,返回 null(表示未找到)。 2. 比较目标值与当前节点值: - 相等:返回当前节点。 - 目标值小:转向左子树。 - 目标值大:转向右子树。 3. 重复步骤直到找到或遍历完。 下面以 Python 代码实现 BST 查找(包含递归迭代版本)。假设二叉树节点定义为 `TreeNode` 类(包含 `val`、`left`、`right` 属性)。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 递归实现 BST 查找 def search_bst_recursive(root, target): """在BST中递归查找目标值节点""" if root is None or root.val == target: # 空树或找到目标 return root if target < root.val: # 目标值小,递归左子树 return search_bst_recursive(root.left, target) else: # 目标值大,递归右子树 return search_bst_recursive(root.right, target) # 迭代实现 BST 查找 def search_bst_iterative(root, target): """在BST中迭代查找目标值节点""" current = root while current is not None: if current.val == target: # 找到目标 return current elif target < current.val: # 转向左子树 current = current.left else: # 转向右子树 current = current.right return None # 未找到 ``` **代码说明**: - 递归版本:简洁但可能栈溢出;适用于小树或平衡树。 - 迭代版本:高效且节省内存;推荐用于生产环境。 - 在普通二叉树中,需修改为 DFS 或 BFS 遍历(例如,DFS 递归中遍历所有节点),但效率较低($O(n)$)。 - 测试示例:若树为 `root = TreeNode(5, TreeNode(3), TreeNode(7))`,查找 `target=3` 将返回左节点。 该实现基于标准二叉搜索树算法,确保在平均情况下高效[^1]。如果您有“编号2201”的具体细节(如问题描述),我可以进一步定制回答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值