每日一題之《劍指offer》23,24題

第二十三題:二叉搜索樹的后續(xù)遍歷序列

難易度:??

輸入一個(gè)整數(shù)數(shù)組,判斷該數(shù)組是不是某二叉搜索樹的后序遍歷的結(jié)果
如果是則輸出Yes,否則輸出No。假設(shè)輸入的數(shù)組的任意兩個(gè)數(shù)字都互不相同。

對(duì)于一個(gè)二叉搜索樹而言,例如:



該二叉搜索樹的后續(xù)遍歷的結(jié)果為:

9,13,11,20,32,30,16

不難看出,后續(xù)遍歷的序列中,最后一個(gè)數(shù)字為一個(gè)二叉搜索樹的root節(jié)點(diǎn),最后一個(gè)節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)為root節(jié)點(diǎn)的右子樹,從后向前遍歷,遍歷到第一個(gè)小于root.val的那個(gè)節(jié)點(diǎn)為root節(jié)點(diǎn)的左子樹。這樣通過捋順后續(xù)遍歷序列當(dāng)中有什么規(guī)律后,可以想到,我們應(yīng)該使用遞歸的思想。要說明的是,二叉樹和遞歸真的密不可分,因?yàn)?,二叉樹的遍歷就是遞歸。
本題的代碼如下:

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length == 0){
            return false;
        }
        return process(sequence,0,sequence.length - 1);
    }
    public boolean process(int[] arr,int start,int end){
        if(end <= start){
            return true;
        }
        int i = start;
        for(;i < end;i++){
            if(arr[i] > arr[end]){
                break;
            }
        }
        for(int j = i;j < end;j++){
            if(arr[j] < arr[end]){
                return false;
            }
        }
        return process(arr,start,i - 1)&& process(arr,i,end - 1);
    }
}

第二十四題:二叉樹中和為某一值的路徑

難易度:???

給出二叉樹的TreeNode 類
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
輸入一顆二叉樹的根節(jié)點(diǎn)和一個(gè)整數(shù),打印出二叉樹中結(jié)點(diǎn)值的和為輸入整數(shù)的所有路徑
路徑定義為從樹的根結(jié)點(diǎn)開始往下一直到葉結(jié)點(diǎn)所經(jīng)過的結(jié)點(diǎn)形成一條路徑

如示例:


當(dāng)target = 22 時(shí),共有兩條路徑即:10 ->5 ->710 ->12
先上代碼:

import java.util.ArrayList;

public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        int sum = 0;
        process(root,target,listAll,list,sum);
        return listAll;
        
    }
    public void process(TreeNode node,int target,ArrayList<ArrayList<Integer>> listAll,ArrayList<Integer> list,int sum){
        if(node == null){
            return;
        }
        sum += node.val;
        if(node.left == null && node.right == null){
            if(sum == target){
                list.add(node.val);
                listAll.add(new ArrayList(list));
                list.remove(list.size() - 1);
            }
            return;
        }else{
            list.add(node.val);
            process(node.left,target,listAll,list,sum);
            process(node.right,target,listAll,list,sum);
            list.remove(list.size() - 1);
        }
    }
}

前序遍歷二叉樹,同時(shí)使用一個(gè)變量來記錄從頭節(jié)點(diǎn)一直到尾節(jié)點(diǎn)的和,如果遍歷到尾節(jié)點(diǎn),和不等于target則說明這一條路徑不是節(jié)點(diǎn)和相加為target的路徑。如果遍歷到了尾節(jié)點(diǎn),和等于target 那么我們就將這個(gè)序列添加到保存ArrayList的listAll中。在前序遍歷二叉樹的時(shí)候,我們使用了棧這種數(shù)據(jù)結(jié)構(gòu),本題使用了ArrayList,為了保證每次遍歷到下一個(gè)節(jié)點(diǎn)的時(shí)候不重復(fù),所以在每個(gè)過程結(jié)束的時(shí)候,要使用ArrayList模擬stack.pop()這個(gè)功能即:

list.remove(list.size() - 1);

本題的思路不太好想清楚,要知道,sum統(tǒng)計(jì)的是每一條鏈的和,最開始寫這個(gè)代碼的時(shí)候在list.remove()操作后,我想將sum 再減去當(dāng)前節(jié)點(diǎn)的值,但這樣就錯(cuò)了。因?yàn)閷?shí)質(zhì)是每一條鏈都獲得了相應(yīng)鏈節(jié)點(diǎn)的和 sum。應(yīng)該重點(diǎn)去感受本題的計(jì)算過程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 動(dòng)態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題,只...
    6默默Welsh閱讀 2,603評(píng)論 0 1
  • 樹 記錄《劍指offer》中所有關(guān)于樹的題目,以及LeetCode中的相似題目。 相關(guān)題目列表 題目 樹是一種最常...
    wenmingxing閱讀 1,517評(píng)論 2 13
  • 21.棧的壓入,彈出序列 題目:輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否可能為該棧的彈出...
    傑jay閱讀 178評(píng)論 0 0
  • 1.二維數(shù)組的查找 在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從...
    linjiason閱讀 779評(píng)論 0 0
  • 1.二維數(shù)組的查找 題目描述:在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長度相同),每一行都按照從左到右遞增的順序排序,每一...
    少年夢游計(jì)_3403閱讀 1,223評(píng)論 0 1

友情鏈接更多精彩內(nèi)容