20200210:(leetcode 623)在二叉樹中增加一行

題目

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

算法與思路

  • 本題的思路在題目中已經爲我們全部說明了,下面再列一遍就可以了

  • 給定一個深度值 d (正整數),針對深度爲 d-1 層的每一非空節點 N,爲 N 創建兩個值爲 v 的左子樹和右子樹。

    將 N 原先的左子樹,連接爲新節點 v 的左子樹;將 N 原先的右子樹,連接爲新節點 v 的右子樹。

    如果 d 的值爲 1,深度 d - 1 不存在,則創建一個新的根節點 v,原先的整棵樹將作爲 v 的左子樹。

具體的做法見代碼,對於二叉樹我們直接使用深度優先遍歷找到對應的節點,判斷節點的規則爲節點的深度,使用遞歸寫法實現。

代碼實現

package com.immunize.leetcode.addOneRow;

public class Solution {
	public class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;

		TreeNode(int x) {
			val = x;
		}
	}
	// 添加一行
	public TreeNode addOneRow(TreeNode t, int v, int d) {
		// 如果爲第一行,則直接添加樹到新節點的左孩子
		if (d == 1) {
			TreeNode n = new TreeNode(v);
			n.left = t;
			return n;
		}
		// 
		insert(v, t, 1, d);
		return t;
	}

	// 實現插入
	public void insert(int val, TreeNode node, int depth, int n) {
		// 排除特殊情況
		if (node == null)
			return;
		// 如果當前需要處理的節點的深度符合d-1
		if (depth == n - 1) {
			// 取出當前左孩子賦值給t
			TreeNode t = node.left;
			// 當前左孩子填充新的val
			node.left = new TreeNode(val);
			// 再把原來的左孩子t接上
			node.left.left = t;
			// 同理如右孩子
			t = node.right;
			node.right = new TreeNode(val);
			node.right.right = t;
		} else {
			insert(val, node.left, depth + 1, n);
			insert(val, node.right, depth + 1, n);
		}
	}
}

複雜度分析

時間複雜度:O(N):最差需要遍歷整個樹的所有節點一次,最好直接插入。
空間複雜度:O(N):相同深度的節點對應一個棧堆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章