給每一個結點新增向右的next指標結點

weixin_34208283發表於2018-11-30

版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~


  • Populating Next Right Pointers in Each Node

Given a binary tree

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

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set toNULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

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

After calling your function, the tree should look like:

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \  / \
    4->5->6->7 -> NULL
  • 題目大意:題目給出了二叉樹的資料結構,要求給每一個結點新增next指標結點,指標指向右邊的下一個結點。如果沒有下一個右邊結點,next指標應該被設定為指向NULL

    提示:(1)只能使用固定的額外空間;(2)假設二叉樹都是完美的二叉樹(即,所有的葉子都在同一層上,而且每個父結點都有兩個孩子結點)。

    就像例子中給出的就是完美二叉樹。

    在呼叫完成的函式後,二叉樹的結構變成了上面那樣。

  • 思路:仔細考慮題目要求,發現是在同一層上進行操作,應該想到用層次法對二叉樹進行操作,思路如下,判斷當前節點如果不是葉子結點,說明他有兩個孩子結點,將左孩子結點指向右孩子結點,再判斷該結點有沒有next結點,如果有,那他也有兩個孩子結點,就可以把當前結點的右孩子結點指向next結點的左孩子結點,然後再判斷next結點的情況,判斷完這一層的,再去判斷下一層。

    當然還有遞迴的思想就比較簡單了。

  • 程式碼:(遞迴)

// 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; //當前節點存在
        // 當前結點不是葉子結點,那必然就有兩個結點,就讓左孩子結點的next指向右孩子結點
        if(root->left!=NULL&&root->right!=NULL)
            root->left->next=root->right;
        // 當前結點不是葉子結點,且有next結點
        if(root->right!=NULL&&root->next!=NULL)
            root->right->next=root->next->left;
        connect(root->left); // 遞迴判斷左子樹的情況
        connect(root->right); // 遞迴判斷右子樹的情況
    }
};

(非遞迴)

// 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) {
        TreeLinkNode *r = root;
        while(r && r->left){ // 結點非空,且存在孩子結點(左右結點判斷一個就好,一個有就都有)
            TreeLinkNode *cur = r;
            while(cur && cur->left){ // 結點非空,且存在孩子結點(左右結點判斷一個就好,一個有就都有)
                // 讓當前結點的左孩子結點的next指向當前結點的右孩子結點
                cur->left->next = cur->right;
                // 如果當前結點有next結點,
                // 就讓當前結點的右孩子結點的next指向當前結點的next結點的左孩子結點
                // (當前結點有孩子結點,說明當前節點的next結點也必有孩子結點)
                cur->right->next = cur->next == NULL ? NULL : cur->next->left;
                // 層序向右
                cur = cur->next;
            }//while
            // 層序向下
            r = r->left;
        }//while
    }
};
  • 以上。

版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~


相關文章