日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS)

發布時間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

Given the root of an N-ary tree of unique values, and two nodes of the tree p and q.

You should move the subtree of the node p to become a direct child of node q. If p is already a direct child of q, don’t change anything. Node p must be the last child in the children list of node q.

Return the root of the tree after adjusting it.

There are 3 cases for nodes p and q:

  • Node q is in the sub-tree of node p.
  • Node p is in the sub-tree of node q.
  • Neither node p is in the sub-tree of node q nor node q is in the sub-tree of node p.

In cases 2 and 3, you just need to move p (with its sub-tree) to be a child of q, but in case 1 the tree may be disconnected, thus you need to reconnect the tree again. Please read the examples carefully before solving this problem.

Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples).

For example, the above tree is serialized as [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14].

Example 1:

Input: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 4, q = 1
Output: [1,null,2,3,4,null,5,null,6,null,7,8]
Explanation: This example follows the second case as node p is in the sub-tree of node q. We move node p with its sub-tree to be a direct child of node q.
Notice that node 4 is the last child of node 1.

Example 2:

Input: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 7, q = 4
Output: [1,null,2,3,null,4,5,null,6,null,7,8]
Explanation: Node 7 is already a direct child of node 4. We don’t change anything.

Example 3:

Input: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 3, q = 8
Output: [1,null,2,null,4,5,null,7,8,null,null,null,3,null,6]
Explanation: This example follows case 3 because node p is not in the sub-tree of node q and vice-versa. We can move node 3 with its sub-tree and make it as node 8’s child.

Example 4:

Input: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 2, q = 7
Output: [1,null,7,3,null,2,null,6,null,4,5,null,null,8]
Explanation: Node q is in the sub-tree of node p, so this is case 1.
The first step, we move node p (with all of its sub-tree except for node q) and add it as a child to node q.
Then we will see that the tree is disconnected, you need to reconnect node q to replace node p as shown.

Example 5:

Input: root = [1,null,2,3,null,4,5,null,6,null,7,8], p = 1, q = 2
Output: [2,null,4,5,1,null,7,8,null,null,3,null,null,null,6]
Explanation: Node q is in the sub-tree of node p, so this is case 1.
The first step, we move node p (with all of its sub-tree except for node q) and add it as a child to node q.
As node p was the root of the tree, node q replaces it and becomes the root of the tree.

Constraints: The total number of nodes is between [2, 1000]. Each node has a unique value. p != null q != null p and q are two different nodes (i.e. p != q).

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/move-sub-tree-of-n-ary-tree
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 先看下 p 在不在 q 的直接子節點里,在的話直接返回
  • 再 DFS 確定 q 是不是 p 的子樹節點,以及找到 p\q 的父節點
  • 再分兩種情況討論,見注釋
/* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;} }; */class Solution {Node *pf = NULL, *qf = NULL;//父節點bool qisSubOfp = false;bool foundp = false;bool foundq = false; public:Node* moveSubTree(Node* root, Node* p, Node* q) {for(auto node : q->children)if(node == p)//p是q的直接子節點,無需操作return root;Node* empty = new Node(-1);//建立空節點方便處理empty->children.push_back(root);dfs(empty, NULL, p, q);//q 不是 p 的子節點,p肯定不是rootif(!qisSubOfp){//找到 pf 子節點 p 的 iterauto it = find(pf->children.begin(),pf->children.end(),p);pf->children.erase(it);//刪除之q->children.push_back(p);//p接到q的子節點中return root;}//q 是 p 的子樹節點,p可能是rootauto it = find(qf->children.begin(),qf->children.end(),q);qf->children.erase(it);//斷開 q 與 qfit = find(pf->children.begin(),pf->children.end(),p);//斷開 p 與 pfit = pf->children.erase(it);//it指向下一個,即 pf child 中 p 的下一個位置q->children.push_back(p);//接入到q下面pf->children.insert(it, q);//pf 的子節點 原來 p 的位置 插入 qreturn empty->children[0];}void dfs(Node* root, Node* fa, Node* p, Node* q){if(!root) return;if(root == p){pf = fa;foundp = true;}if(root == q){if(foundp)qisSubOfp = true;qf = fa;foundq = true;}for(auto c : root->children)dfs(c, root, p, q);if(root == p)foundp = false;//回溯if(root == q)foundq = false;//回溯} };

84 ms 28.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。