116/117. Populating Next Right Pointers in Each Node I/II

先看116
Given a binary tree

struct Node {
int val;
Node *left;
Node *right;
Node *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 to NULL.

在這裏插入圖片描述

method 1 層次遍歷

顯然本題可歸爲層序遍歷的問題,直接套用層序遍歷的模板稍加修改即可

Node* connect(Node* root) {
	queue<Node*> q;
	q.push(root);
	q.push(NULL);
	while (q.size() > 1)
	{
		Node* p = q.front(); 
		while (p != NULL){
			if (p->left) q.push(p->left);
			if (p->right) q.push(p->right);
			q.pop();
			Node* next = q.front();
			if (next == NULL) break;
			p->next = next;
			p = next;
		}

		q.pop();
		q.push(NULL);
	}

	return root;
}

method 2

但本題在不考慮遞歸棧的空間情況,是有O(1) space的算法
還是層序遍歷的思想,但通過思考可以發現,當上一層的next指針連接好時,可以通過上一層的遍歷連接本層的結點

void connect(Node *root) {
	if (!root)
		return;
	while (root->left)
	{
		Node *p = root;
		while (p)
		{
			p->left->next = p->right;
			if (p->next)
				p->right->next = p->next->left;
			p = p->next;
		}
		root = root->left;
	}
}

summary

  1. 把樹的問題歸納爲遍歷順序的問題
  2. 這種遞歸問題的範式:當處理第n層時,有助於處理第n+1層,並且一般一開始的情況很好處理,有點像動態規劃

進一步,看117題,

在這裏插入圖片描述
所給的條件不再是一顆perfect tree,增加了難度
同樣地,可以套用層序的模板
但是想達到O(1) space,那麼必須在連接第n層的時候,記錄第n+1層的第一個結點,在116問題中所給的是一顆完全二叉樹,所以這不是一個問題,但在117中這並不確定,因此可以引入dummyNode,當遍歷第n層結點時,指示第n+1層的第一個結點
dummyNode的概念:https://blog.csdn.net/skyline_sun/article/details/81275746

class Solution {
public:
    Node* connect(Node* root) {
       if (!root) return root;
	Node* ans = root;
	Node* dummyNode = new Node(0);
	while (root)
	{
		Node* cur = dummyNode;
		while (root)
		{
			if (root->left){ cur->next = root->left; cur = cur->next;}
			if (root->right){ cur->next = root->right; cur = cur->next;}
			root = root->next;
		}

		root = dummyNode->next;
		dummyNode->next = NULL;
	}

	return ans;
    }
};

dummyNode->next = NULL; 的作用在於,當遍歷樹的最後一行,防止外部的循環無限循環

summary

  1. 把樹的問題歸納爲遍歷順序的問題
  2. 引入dummyNode指示第一個結點!在鏈表問題中避免第一個結點的多餘操作,還可以指示第一個結點
  3. trick : 爲什麼dummyNode會指示下一層的第一個結點,因爲又另外聲明瞭一個cur結點,讓cur結點進行層序遍歷,並提前將dummyNode賦值給cur,在cur結點遍歷的時候,會自然遍歷到第一個結點,此時dummyNode指向第一個結點(通過賦值的辦法,使一個指針得到頭結點,並且不用隨另一指針遍歷而被改變)
發佈了93 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章