Leetcode中级 每个结点的右向指针C++

给定一个二叉树

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

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

说明:

你只能使用额外常数空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。
示例:

给定完美二叉树,

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

调用你的函数后,该完美二叉树变为:

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

思路:分三种情况:1.当前结点为左子节点,那么它的next结点为其父节点的右子节点;2.当前结点为右子节点,那么它的next结点为其父节点的next结点的左子节点;3.如果父节点不存在next结点,那么当前结点的next结点为NULL。然后递归知道当前结点为NULL

class Solution {
public:
    void connect(TreeLinkNode *root) {
        if(root == NULL)
            return ;
        root->next = NULL;//根结点的next结点肯定为NULL
        helper(root->left,root,NULL);
        helper(root->right,root,NULL);
    }
    void helper(TreeLinkNode* current,TreeLinkNode* parent,TreeLinkNode* pnext)
    //三个参数,当前结点,当前结点的父节点,当前结点的父节点的next结点
    {
        if(current == NULL)
            return ;
        if(current == parent->left)	//第一种情况
        {
            current->next = parent->right;
            helper(current->left,current,parent->right);
            helper(current->right,current,parent->right); 
        }else if(current == parent->right)
        {
            if(pnext == NULL)	//第三种情况
            {
                current->next = NULL;
                helper(current->left,current,NULL);
                helper(current->right,current,NULL);
            }else	//第二种情况
            {
                current->next = pnext->left;
                helper(current->left,current,pnext->left);
                helper(current->right,current,pnext->left);
            }
        }                
    }
};

猜你喜欢

转载自blog.csdn.net/Mr_Lewis/article/details/85115933