資料結構——大一學c++的時候就非常頭疼的東西,沒想到現在js都要考資料結構與演算法了,看到有面試題手寫乙個二叉樹插入,對比劍指offer上的題真算得上是太簡單了。本次整合一下做過的二叉樹題的思路和**,希望能對邏輯思維的提公升有個幫助。
寫出二叉樹插入方法insert。
分析
首先判斷根節點有無,如果沒有就賦給他;如果有根節點,繼續判斷data與節點val值的大小,datathis.val)else
}else if(data輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
分析
前序遍歷指的「中 左 右」排序分布,中序遍歷指的 「左 中 右」排序分布,前序遍歷的第乙個值為根節點;在中序遍歷中找到根節點的位置,它左邊的即為左子樹的中序遍歷,右邊的即為右子樹的中序遍歷;根據中序遍歷中得到的左子樹和右子樹長度,即可拿到前序遍歷中,根據長度找到左子樹和右子樹的前序遍歷;最後進行遞迴。
/* function treenode(x) */
function reconstructbinarytree(pre, vin)
; //如果根節點不在最後乙個的位置(有右子樹)
if(root_pos !== pre.length-1)
return node;
}
給定一棵二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。
分析
二叉搜尋樹即左《根《右,中序遍歷採用「左 中 右」順序,據此我們很容易得到乙個排列好順序的陣列。我之前的想法是隨便遍歷只要放到陣列中即可,然後再用sort排列,後發現這樣不行,因為牛客網讓push到陣列裡的東西不是node.val而是node
function kthnode(proot, k)
arr.push(node);
if(node.right)
}inorder(proot);
if(k<1||k>arr.length) return null;
return arr[k-1];
}
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
分析
首先要搞明白平衡二叉樹的意思:某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。所以我們可以根據二叉樹左右兩邊的深度相差得到答案,關鍵的地方轉化為求二叉樹深度了。
function isbalanced_solution(proot)
function treedepth(node)
補一些小常識:整個樹的最大層數成為樹的深度,深度是從下往上數的;節點所在的層從根開始定義,根節點為第1層,層是從上往下數的;節點擁有的子樹數稱為結點的度(二叉樹度不大於2)。
從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
分析
將遍歷到的一行push進陣列,此時再shift出來,他們就是排好順序的,依次將他們的值push進data;再判斷是否有左右子樹,再push進去,此時已經是全排在上一層之後了。
function printfromtoptobottom(root)
while(arr.length!==0)
return data;
}
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...
資料結構之二叉樹
定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...
資料結構之二叉樹
來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...