(树)每一层节点的右指针问题(层次遍历)

  • 题目:https://www.nowcoder.com/practice/fdbd05d647084fcf9be78444e231998b?tpId=46&tqId=29064&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
  • 题目翻译:

    给定一个二叉树
    
         struct TreeLinkNode {
           TreeLinkNode * left;
           TreeLinkNode * right;
           TreeLinkNode * next;
         }}
    
    填充每个下一个指针指向其右下角节点。 如果没有下一个右节点,则下一个指针应该设置为NULL。
    
    最初,所有下一个指针都设置为NULL。
    
    注意:
    
         您只能使用常量额外空间。
         你可以假设它是一个完美的二叉树(即所有的叶子在同一层,每个父母有两个孩子)。
    
    例如,
    给定以下完美的二叉树,
    
              1
            /        2 3
          / \ /      4 5 6 7
    
    调用你的函数后,树应该看起来像:
    
              1 - > NULL
            /        2 - > 3 - > NULL
          / \ /      4-> 5-> 6-> 7 - > NULL
  • 思路:这道题目的思路就是递归法解决。先是处理简单情况下面的问题,然后再去分别处理左右子树的问题。
  • 代码:

    /**
     * Definition for binary tree with next pointer.
     * struct TreeLinkNode {
     *  int val;
     *  TreeLinkNode *left, *right, *next;
     *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if (root == NULL)
                return;
            if (root->left != NULL && root->right != NULL)
                root->left->next = root->right;
    
            if (root->next != NULL && root->right != NULL)
                root->right->next = root->next->left;
            connect(root->left);
            connect(root->right);
    
        }
    };
  • 题目二:升级版本:https://www.nowcoder.com/practice/f18bc13a954f4389900b56e545feca6e?tpId=46&tqId=29063&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
  • 题目翻译:

    跟进问题“在每个节点中填充下一个右指针”。
    
    如果给定的树可以是任何二叉树? 您以前的解决方案是否仍然有效?
    
    注意:
    
         您只能使用常量额外空间。
    
    例如,
    给定以下二叉树,
    
              1
            /        2 3
          / \      4 5 7
    
    调用你的函数后,树应该看起来像:
    
              1 - > NULL
            /        2 - > 3 - > NULL
          / \      4-> 5 - > 7 - > NULL
  • 思路:这道题目看起来和前面的题目好像类似,但是他是针对普通的二叉树,而不是完全二叉树。这一类的问题看前来更像是层次遍历的问题,用层次遍历的思想很容易解决。
      对每一个根节点判断他的左右子树是否为空,不为空进入队列.然后特殊处理一个队列尾节点,用来标志某个节点的next为NULL。当当前节点等于队列的尾节点,说明当前节点的next必为NULL。

    代码:

    /**
     * Definition for binary tree with next pointer.
     * struct TreeLinkNode {
     *  int val;
     *  TreeLinkNode *left, *right, *next;
     *  TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void connect(TreeLinkNode *root) {
            if (root == NULL)
                return ;
            queue<TreeLinkNode *> dq;
            TreeLinkNode *tail= root;
            TreeLinkNode *temp = NULL;
            dq.push(root);
            while (!dq.empty()){
                temp = dq.front();
                dq.pop();
                if (temp->left != NULL)
                    dq.push(temp->left);
                if (temp->right != NULL)
                    dq.push(temp->right);
                if (temp == tail){
                    temp->next = NULL;
                    tail= dq.back();
                }
                else
                    temp->next = dq.front();
            }
    
        }
    };

给定一个二叉树

struct TreeLinkNode {
       TreeLinkNode * left;
       TreeLinkNode * right;
       TreeLinkNode * next;
     }}

填充每个下一个指针指向其右下角节点。 如果没有下一个右节点,则下一个指针应该设置为NULL。

最初,所有下一个指针都设置为NULL。

注意:

您只能使用常量额外空间。
     你可以假设它是一个完美的二叉树(即所有的叶子在同一层,每个父母有两个孩子)。

例如,
给定以下完美的二叉树,

1
        / \
       2 3
      / \ / \
     4 5 6 7

调用你的函数后,树应该看起来像:

1 - > NULL
        / \
       2 - > 3 - > NULL
      / \ / \
     4-> 5-> 6-> 7 - > NULL

时间: 2024-11-11 14:25:21

(树)每一层节点的右指针问题(层次遍历)的相关文章

[Leetcode] Populating next right pointer in each node ii 填充每个节点的右指针

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant extra space. For example,Given the following binary tr

[LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant extra space. For example,Given the following binary tr

【转】将一棵树转换为二叉树后,为什么根节点没有右子树

树转化为二叉树时结点左子树是原来的孩子结点,右子树是原来的兄弟结点.即取根节点左孩子向右连接他的兄弟结点(在同一层次的节点,原来互不相连)并把它的子树,而把除左孩子外,原来与根节点相连的线擦除.这样根节点没有右孩子,因为由树转化来的二叉树某个节点A的左子树是原来作为树时A的孩子,其右子树是他的兄弟. 原文地址:https://www.cnblogs.com/schips/p/10630811.html

【LeetCode-面试算法经典-Java实现】【117-Populating Next Right Pointers in Each Node(二叉树链接右指针II)】

[117-Populating Next Right Pointers in Each Node(二叉树链接右指针II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solutio

【LeetCode-面试算法经典-Java实现】【116-Populating Next Right Pointers in Each Node(二叉树链接右指针)】

[116-Populating Next Right Pointers in Each Node(二叉树链接右指针)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } Populate each next pointer to point to its next

输出树的单层节点

理解题意,注意链表创建和树的层次遍历. /***************************************************** * \file TreeLevel.cpp * \date 2016/05/31 17:05 * \问题描述: 对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表. 给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接, 保证深度

4.6 找出二叉树中指定节点的下一个节点(中序后继),假定每个节点有父指针。

5 / 2 6 / \ 1 4 7 / 3 class Node{ Node left; Node right; Node parent; int val; } /** 1.如果有右子树,则结果为右子树的最左节点. 2.如果没有右子树,则需要回到父节点,如果当前节点是父节点的左子树,则父节点就是结果,如果不是继续向上再找父节点. */ public TreeNode inorderSucc(TreeNode n){ if(n==null) return null; if(n.right!=nul

hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定义每条路径的值为经过的节点的不同颜色数.求所有路径的值和. 思路:看题解后,才想出来的.树形dp. 求所有路径的值和 = 路径条数*总颜色数(n*(n-1)*colors/2)-sigma(每种颜色没有经过的路径条数) 主要是求每种颜色没有经过的路径条数. 画一棵树,我直接用颜色值表示节点编号. 2

LeetCode:Path Sum - 树的根节点到叶节点的数字之和

1.题目名称 Path Sum(树的根节点到叶节点的数字之和) 2.题目地址 https://leetcode.com/problems/path-sum/ 3.题目内容 英文:Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. 中文:给定一颗二叉树,如