1. 程式人生 > >Leetcode 863. All Nodes Distance K in Binary Tree

Leetcode 863. All Nodes Distance K in Binary Tree

解法:便利所有除了目標節點分支的節點,標記他們的爸爸和自己是左是右。然後從目標節點向外便利。

/**
 * 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:
    class Dad_lr
	{
	public:
		TreeNode* dad;//父節點
		int lr;//12代表左右孩子
	};
	void addDad(map<TreeNode*, Dad_lr> &head, TreeNode* root, TreeNode* target)//加父親節點
	{
		if (root->val != target->val) //目標節點孩子節點不需要標記父親
		{
			if (root->left != NULL) 
			{
				Dad_lr s;
				s.dad = root; s.lr = 1;
				head[root->left] = s; 
				addDad(head, root->left, target); 
			}
			if (root->right != NULL) 
			{
				Dad_lr s;
				s.dad = root; s.lr = 2;
				head[root->right] = s;
				addDad(head, root->right, target); 
			}
		
		}
	}
	void fun139(map<TreeNode*, Dad_lr> &head, TreeNode* root,int now, int k,vector<int> &ans,int close)//核心演算法 便利左右孩子和爹爹(要判斷爹爹是否存在) 
	{
		//close表示左右父親那個關閉通道1234
		if (now == k) ans.push_back(root->val);
		else if(now<k)//比k還大就算了 走遠了
		{
			if (root->left != NULL&&close!=1)fun139(head,root->left, now + 1, k, ans,3);
			if (root->right != NULL&&close!=2)fun139(head,root->right, now + 1, k, ans,3);
			if (head.count(root) > 0&&close!=3)fun139(head, head[root].dad, now + 1, k,ans, head[root].lr);
		}
	}
	vector<int> distanceK(TreeNode* root, TreeNode* target, int K)
	{
		//兩種情況 一種向下便利 一種向上便利 向上要設定他老爹是誰
		vector<int> ans;
		if (root == NULL)return ans;//邊界
		map<TreeNode*, Dad_lr> head;//用於儲存每個節點的爸爸
		//head[root] = NULL;
		addDad(head, root, target);
		fun139(head, target,0, K, ans,4);
		return ans;
	}
};

We are given a binary tree (with root node root), a target node, and an integer value K.

Return a list of the values of all nodes that have a distance K from the target node.  The answer can be returned in any order.

Example 1:

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

Output: [7,4,1]
Explanation: The nodes that are a distance 2 from the target node (with value 5) have values 7, 4, and 1. Note that the inputs "root" and "target" are actually TreeNodes. The descriptions of the inputs above are just serializations of these objects.

Note:

  1. The given tree is non-empty.
  2. Each node in the tree has unique values 0 <= node.val <= 500
    .
  3. The target node is a node in the tree.
  4. 0 <= K <= 1000.