第六章 二叉樹part08
669. 修剪二叉搜尋樹 108.將有序陣列轉換為二叉搜尋樹
538.把二叉搜尋樹轉換為累加樹
669. 修剪二叉搜尋樹
題目 連結 :
Code ( 非遞迴 分支 處理 + 狀態碼 的 使用 ( 處理 過程 狀態碼 + “ Result 情況 狀態碼 ” + 後端 處理 狀態碼 ) ) :
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
// Think
// Need Think
if(root == nullptr )
{
return root ;
}
// 對 左 邊界 的 處理 / 相關 處理
int val_root = root->val ;
TreeNode * node_Work_For_LeftSide = root ;
TreeNode * node_Pre_From_Work_For_LeftSide = nullptr ;
TreeNode * root_New_For_Return = root ;
// 歷史 指標 可以 選擇 性 的 使用
// xx 結點 內 的 資訊 也要 Authentication
// 這裡 是 xx 結點 / Target 結點 右 子 結點 的 情況
int state_code_Front_For_LeftSide = 0 ;
// 1 左 搜
// 2 右 搜
int state_code_Backward_For_LeftSide = 0 ;
//cout<<111111111<<endl;
if(low < val_root )
{
state_code_Front_For_LeftSide = 1 ;
while(1)
{
//cout<< " node_Work_For_LeftSide->val : " << node_Work_For_LeftSide->val<<endl;
//cout<<1111<<endl;
//cout<<111111111<<endl;
if( state_code_Front_For_LeftSide == 1 )
{
// Think
// Debug
// Think
//cout<<2222<<endl;
if( low < node_Work_For_LeftSide -> val )
{
node_Pre_From_Work_For_LeftSide = node_Work_For_LeftSide ;
if(node_Work_For_LeftSide -> left != nullptr && node_Work_For_LeftSide->val >= low )
{
node_Work_For_LeftSide = node_Work_For_LeftSide -> left ;
}
else
{
if(node_Work_For_LeftSide -> left == nullptr)
{
state_code_Backward_For_LeftSide = 3 ; // 二叉搜尋樹 內 的 結點 值 均在 左邊界 範圍 內