18. 重建二叉樹
輸入一棵二叉樹前序遍歷和中序遍歷的結果,請重建該二叉樹。
class19. 二叉樹的下乙個節點solution
treenode* build(int l1,int r1,int l2,int
r2)};
給定一棵二叉樹的其中乙個節點,請找出中序遍歷序列的下乙個節點。
class43. 不分行從上往下列印二叉樹(層序遍歷)solution
//沒有右子樹,則找到最近左子樹的父節點;
while(p->father && p != p->father->left)
p = p->father;
return p->father;}};
class46. 二叉搜尋樹的後序遍solution
}return
res;}};
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。
如果是則返回true,否則返回false。
假設輸入的陣列的任意兩個數字都互不相同。
二叉搜尋樹的中序遍歷就是排好序的,可以根據中序遍歷和後序遍歷建立二叉樹,再驗證;
也可以不需要用中序遍歷,直接根據後序遍歷最後乙個數是根節點來做:
class47. 二叉樹中和為某一值的路徑solution
bool dfs(int l , int
r)};
輸入一棵二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。
從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
class過倒是能過,不過還是有很多地方可以優化的地方:solution
if(p->left)
dfs(p->left,t,cnt);
if(p->right)
dfs(p->right,t,cnt);
}vector
int>> findpath(treenode* root, int
_sum)
};
class還有就是dfs的回溯時要記得彈出最後乙個元素;solution //注意
if(!p->left && !p->right && sum==0
) res.push_back(temp);
dfs(p->left,sum);
dfs(p->right,sum);
temp.pop_back();
//空間優化
} vector
int>> findpath(treenode* root, int
sum)
};
dfs不一定要在最後處理,在過程中間判斷也行;
49. 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。
要求不能建立任何新的結點,只能調整樹中結點指標的指向。
注意:例如,輸入下圖中左邊的二叉搜尋樹,則輸出右邊的排序雙向鍊錶。
就在中序遞迴遍歷的基礎上改了一點點,用乙個pre指標儲存中序遍歷的前乙個結點。
因為是中序遍歷,遍歷順序就是雙線鍊錶的建立順序;
每乙個結點訪問時它的左子樹肯定被訪問過了,所以放心大膽的改它的left指標,不怕樹斷掉;
同理,pre指向的結點儲存的數肯定小於當前結點,所以其左右子樹肯定都訪問過了,所以其right指標也可以直接改。
最後需要一直向左找到雙向鍊錶的頭結點。
/** * definition for a binary tree node.
* struct treenode
* }; */
class
solution
treenode*pre;
void dfs(treenode*cur)
};
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
玩轉二叉樹(二叉樹的遍歷)
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...