劍指offer:33-37記錄

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的后序遍歷結果。如果是則返回?true,否則返回?false。假設輸入的數組的任意兩個數字都互不相同。

?

參考以下這顆二叉搜索樹:

? ? ?5
? ? / \
? ?2 ? 6
? / \
?1 ? 3
示例 1:

輸入: [1,6,3,2,5]
輸出: false
示例 2:

輸入: [1,3,2,6,5]
輸出: true
?

提示:

數組長度 <= 1000

思路:找到第一個比根大的數字x,x右邊所有數字都要比根大才符合定義。

然后對左右子樹重復上述過程。

class Solution {int[] postorder;public boolean verifyPostorder(int[] postorder) {this.postorder=postorder;return verify(0, postorder.length - 1); }// 遞歸實現private boolean verify(int left, int right){if (left >= right) return true;int rootValue = postorder[right]; // 當前根// 找出第一個大于根節點的,右邊必須都在右子樹中int k = left;while (k < right && postorder[k] < rootValue){ k++;}//判斷for (int i = k; i < right; i++){if (postorder[i] < rootValue) return false;}return verify(left, k - 1) && verify(k, right - 1);}
}

輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

?

示例:
給定如下二叉樹,以及目標和?sum = 22,

? ? ? ? ? ? ? 5
? ? ? ? ? ? ?/ \
? ? ? ? ? ? 4 ? 8
? ? ? ? ? ?/ ? / \
? ? ? ? ? 11 ?13 ?4
? ? ? ? ?/ ?\ ? ?/ \
? ? ? ? 7 ? ?2 ?5 ? 1
返回:

[
? ?[5,4,11,2],
? ?[5,8,4,5]
]

提示:

節點總數 <= 10000

思路:深搜+回溯

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {List<List<Integer>> ans=new ArrayList();List<Integer> temp=new ArrayList();public List<List<Integer>> pathSum(TreeNode root, int sum) {help(root,sum);return ans;}public void help(TreeNode root, int sum){if(root==null)return;temp.add(root.val);sum-=root.val;if(sum==0 && root.left==null && root.right==null){ans.add(new ArrayList(temp));}help(root.left,sum);help(root.right,sum);temp.remove(temp.size() - 1);}
}

請實現 copyRandomList 函數,復制一個復雜鏈表。在復雜鏈表中,每個節點除了有一個 next 指針指向下一個節點,還有一個 random 指針指向鏈表中的任意節點或者 null。

示例 1:

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:

輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]
示例 3:

輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]
示例 4:

輸入:head = []
輸出:[]
解釋:給定的鏈表為空(空指針),因此返回 null。
?

提示:

-10000 <= Node.val <= 10000
Node.random?為空(null)或指向鏈表中的節點。
節點數目不超過 1000 。

思路:先把每個節點后面復制一個相同的節點,為了方便處理好random。然后再分開即可。

空間O(1)

/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/
class Solution {public Node copyRandomList(Node head) {if (head == null) {return head;}//將拷貝節點放到原節點后面,例如1->2->3這樣的鏈表就變成了這樣1->1'->2'->3->3'for (Node node = head, copy = null; node != null; node = node.next.next) {copy = new Node(node.val);copy.next = node.next;node.next = copy;}//把拷貝節點的random指針安排上for (Node node = head; node != null; node = node.next.next) {if (node.random != null) {node.next.random = node.random.next;}}//分離拷貝節點和原節點,變成1->2->3和1'->2'->3'兩個鏈表,后者就是答案Node newHead = head.next;for (Node node = head, temp = null; node != null && node.next != null;) {temp = node.next;node.next = temp.next;node = temp;}return newHead;}
}

序列化是將一個數據結構或者對象轉換為連續的比特位的操作,進而可以將轉換后的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,采取相反方式重構得到原數據。

請設計一個算法來實現二叉樹的序列化與反序列化。這里不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字符串并且將這個字符串反序列化為原始的樹結構。

示例:?

你可以將以下二叉樹:

? ? 1
? ?/ \
? 2 ? 3
? ? ?/ \
? ? 4 ? 5

序列化為 "[1,2,3,null,null,4,5]"
提示:?這與 LeetCode 目前使用的方式一致,詳情請參閱?LeetCode 序列化二叉樹的格式。你并非必須采取這種方式,你也可以采用其他的方法解決這個問題。

說明:?不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。

思路:我們普通的遍歷(前序中序后序)序列,通常是不能唯一確定一個二叉樹的,需要前中結合或者后中結合。是因為我們不知道哪里可以停止,比如例子中:到3時,我們不知道該掛到2的下面還是2兩邊都是null(3應該掛1的右邊)。解決方法就是把所有的null記錄下來,比如例子中的二叉樹:前序:1,2,null,null,3,4,null,null,5,null,null。下面是在這種做法的實現。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {public String serialize(TreeNode root) {      //用StringBuilderreturn ser_help(root, new StringBuilder()).toString();}public StringBuilder ser_help(TreeNode root, StringBuilder str){if(null == root){str.append("null,");return str;}str.append(root.val); str.append(",");str = ser_help(root.left, str);str = ser_help(root.right, str);return str;}public TreeNode deserialize(String data) {List<String> list_word = new LinkedList<String>(Arrays.asList(data.split(",")));return deser_help(list_word);}public TreeNode deser_help(List<String> li){if(li.get(0).equals("null")){li.remove(0);return null;}TreeNode res = new TreeNode(Integer.valueOf(li.get(0)));li.remove(0);res.left = deser_help(li);res.right = deser_help(li);return res;}
}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444124.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

劍指offer:39-42記錄

數組中有一個數字出現的次數超過數組長度的一半&#xff0c;請找出這個數字。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例 1: 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2 限制&#xff1a; 1 < 數組長度 < 50000 思路&#xff1a;…

炸窩哈希值的原理

package asdfg; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class aaa { public static void main(String[] args) {/*** 小提示&#xff1a;* 1.對于所有沒有索引的方法&#xff0c;我們都不能使用for循環進行遍歷* 2.提到接口&am…

劍指offer:45-48記錄

輸入一個正整數數組&#xff0c;把數組里所有數字拼接起來排成一個數&#xff0c;打印能拼接出的所有數字中最小的一個。 示例 1: 輸入: [10,2] 輸出: "102" 示例 2: 輸入: [3,30,34,5,9] 輸出: "3033459" 提示: 0 < nums.length < 100 說明:…

炸窩(可變函數)

可變函數源碼理解&#xff1a;學生角度&#xff0c;更易操作 public static void main(String[] args) {/*int cadd(10,29);System.out.println(c);*///此時可以隨意的進行數據的傳遞add(20,30,40);//[I1db9742:解釋&#xff0c;中括號代表是一個數組&#xff0c;為一個地址值…

劍指offer:50-53記錄

在字符串 s 中找出第一個只出現一次的字符。如果沒有&#xff0c;返回一個單空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的長度 < 50000 思路&#xff1a;map記錄次數&#xff0c;再…

Eclipse安裝插件的幾種方式

前段時間Google轉向了IDEA&#xff0c;貌似有些動搖了Eclipse作為Java領域IDE龍頭老大的位置&#xff0c;為此引起了Eclipse粉絲和IDEA粉絲的集體罵戰。類似這種罵戰向來都不絕于耳&#xff0c;貌似程序員的都比較多&#xff0c;可能大家都是搞技術出身&#xff0c;都很自信。其…

炸窩(Collections當中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具類&#xff0c;用來對集合進行操作&#xff0c;* * 集合Collections當中的兩個方法&#xff1a;* 1.addAll方法&#xff1a;因為是靜態方法&#xff0c;嗯所以可以.直接吹風機…

劍指offer:55-58記錄

輸入一棵二叉樹的根節點&#xff0c;求該樹的深度。從根節點到葉節點依次經過的節點&#xff08;含根、葉節點&#xff09;形成樹的一條路徑&#xff0c;最長路徑的長度為樹的深度。 例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知識點(炸窩)

/** * 簡單的介紹一下我們接下來準備學習的集合MAP集合 * * Map集合的簡單概述&#xff1a; * 其中的健是不能進行重復的&#xff0c;而且每一健只能映射一個值&#xff0c;簡單的說就是K與V是一一對應的&#xff0c;不能有其他的關系&#xff0c; * 但是我們注意到value值是可…

劍指offer:63-66記錄

假設把某股票的價格按照時間先后順序存儲在數組中&#xff0c;請問買賣該股票一次可能獲得的最大利潤是多少&#xff1f; 示例 1: 輸入: [7,1,5,3,6,4] 輸出: 5 解釋: 在第 2 天&#xff08;股票價格 1&#xff09;的時候買入&#xff0c;在第 5 天&#xff08;股票價格 6&a…

【大總結3】leetcode解題總覽(算法、劍指offer、SQL、多線程、shell)

3/22更新 劍指offer 題目鏈接 建議大部分題都會做&#xff0c;都能比較快速且準確的寫出來。關于做題方式&#xff0c;我的建議是&#xff1a;一道一道刷即可&#xff0c;因為難度一般&#xff0c;不用系統的學習什么知識&#xff0c;遇到實在不會的就跳過即可。 我這里寫了…

逆序存儲【數據結構】

C語言中malloc是動態內存分配函數。 函數原型&#xff1a;void malloc(unsigned int num_bytes); 參數&#xff1a;num_bytes 是無符號整型&#xff0c;用于表示分配的字節數。 返回值&#xff1a;如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定)&#xff0…

為什么 main 方法是 public static void ?

main 方法是我們學習Java編程語言時知道的第一個方法&#xff0c;你是否曾經想過為什么 main 方法是 public、static、void 的。當然&#xff0c;很多人首先學的是C和C&#xff0c;但是在Java中main方法與前者有些細微的不同&#xff0c;它不會返回任何值&#xff0c;為什么 ma…

返回地址【數據結構】

小問題&#xff1f; 1.我們是如何根據地址值來找到我們對應的數據的&#xff1f; 詳細陳述一下&#xff1a;當我們開辟一個整數類型&#xff0c;取名為a&#xff0c;假設地址空間是從數值為2000進行存儲&#xff0c;并且我們假設整形占用4個字節&#xff0c;那么我們在內存中需…

【超級詳細的小白教程】Hexo 搭建自己的博客

– 前言 這是一篇有關如何使用 Github Pages 和 Hexo 搭建屬于自己獨立博客的詳盡教程&#xff0c;本人是軟件工程專業本科生&#xff0c;目前只學習了C和C編程語言&#xff0c;對網站開發的有關知識幾乎為零&#xff0c;這也是我搭建好自己的博客之后寫的第一篇博客&#xff…

面向對象思想精華總結

一、三大特性 封裝繼承多態 二、類圖 泛化關系 (Generalization)實現關系 (Realization)聚合關系 (Aggregation)組合關系 (Composition)關聯關系 (Association)依賴關系 (Dependency) 三、設計原則 S.O.L.I.D其他常見原則 參考資料 一、三大特性 封裝 利用抽象數據類型將數據…

數組名與指向數組的指針之間的聯系與區別【數據結構】

我們遇到一個非常棘手的問題&#xff0c;這個問題就是&#xff0c;對于一堆數據來說&#xff0c;我們進行存儲&#xff0c;放到一個指定的倉庫當中&#xff0c;先前我們使用數組加加標的形式進行訪問倉庫當中的元素位置&#xff0c;但是呢&#xff0c;現在我們使用的是一個指針…

Struts2的action中處理JSONP方式提交的中文亂碼問題:

昨天在做公司網站的時候出現了一個中文亂碼問題&#xff0c;讓我郁悶了一晚上和一上午&#xff0c;最后在網友的提示下&#xff0c;我終于解決了&#xff0c;現在寫出來供后來的兄弟們參考&#xff1a; 1.問題是這樣的&#xff0c;就是客戶端是以JSONP的方式提交的數據&#x…

leetcode509. 斐波那契數(矩陣快速冪)

斐波那契數&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列稱為斐波那契數列。該數列由 0 和 1 開始&#xff0c;后面的每一項數字都是前面兩項數字的和。也就是&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 給定 N&#xff0c;計算 F(N)。…

insert函數的修改,

我們來看一下圖片當中的第2個圓圈&#xff0c;為什么使用size來相加呢&#xff1f;我們知道一開始我們定義的初始空間為init_size;我們想一下啊&#xff0c;如果是第1次進行空間的增加&#xff0c;那么我們使用InIt來進行相加是可以的&#xff0c;但是當第2次想加我們再想開辟空…