輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
第四次做; 理清遞迴函式邏輯, 帶陣列的話, 先寫陣列的操作範圍
/*
根據前序遍歷可以找到根節點, 有了根節點之後可以在中序遍歷中定位到根節點, 從而找出屬於左子樹和右子樹的值
使用遞迴重建二叉樹
*/public
class
solution
//遞迴函式邏輯:操作範圍[prel,prer], [inl, inr], 現在pre中找到根節點的val, 建立根節點(當前條件),
//找出左子樹的操作範圍, 構建左子樹(新條件新遞迴), 根節點連線左子樹的根節點
//找出右子樹的操作範圍, 構建右子樹(新條件新遞迴), 根節點連線右子樹的根節點
//返回當前的根節點(當前條件)
private treenode core
(int
pre,
int[
] in,
int prel,
int prer,
int inl,
int inr)
//建立左子樹(新條件新遞迴), 根節點連線左子樹的根節點
root.left =
core
(pre, in, prel+
1, prel+leftcount, inl, inl+leftcount-1)
;//建立右子樹(新條件新遞迴), 根節點連線右子樹的根節點
root.right =
core
(pre, in, prel+leftcount+
1, prer, inl+leftcount+
1, inr)
;//返回當前的根節點
return root;
}}
第三次做, 遞迴邏輯:在pre,in的指定範圍中找到根節點及左右子樹的範圍,根節點分別連線已經連線好的左右子樹(如果左右子樹存在的話); 如果提前判斷了左右子樹是否存在的話, 就不用寫base case了; 像這種用到左右子樹的題, 盡量先判斷左右子樹是否存在public
class
solution
public treenode core
(int
pre,
int[
] in,
int preleft,
int preright,
int inleft,
int inright)
}
第二次做//細節:其實座標不是0!!! 這是處理部分陣列的共有細節
public
class
solution
public treenode core
(int
pre,
int[
] in,
int preleft,
int preright,
int inleft,
int inright)
//找出當前給定範圍下的根節點, 將根節點與其左右子樹的根節點(如果有的話)相連, 最後返回根節點
//關鍵在於在給定的範圍中找出左右子樹
//傳遞實參時要保證實參不越界! 不要把對實參的檢查放到base case中
//在陣列的一部分上進行操作, 由其要注意邊界! 左邊界都會有preleft, inleft; 右邊界都會有preright, inright
public treenode core
(int
pre,
int[
] in,
int preleft,
int preright,
int inleft,
int inright)
}
時間複雜度: 不斷的二分, 所以時間複雜度是o(logn)
空間複雜度: 沒有使用額外的記憶體空間, 所以空間複雜度是o(1)
/**
* definition for binary tree
* public class treenode
* }*/public
class
solution
public treenode reconstructbinarytree
(int
pre,
int prestart,
int preend,
int[
] in,
int instart,
int inend)
//3.
if(leftlen>0)
if((preend - prestart)
- leftlen >0)
return root;
}}
最優解public
class
solution
//前序遍歷和中序遍歷序列
private treenode reconstructbinarytree
(int
pre,
int startpre,
int endpre,
int[
] in,
int startin,
int endin)
return root;
}}
劍指offer面試題7
面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...
劍指offer面試題15
面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...