由於二叉搜尋樹本身是有序的,利用中序遍歷可以從小到大得到樹中的元素,因此在中序遍歷的遞迴過程中,每次儲存上一次遍歷過的節點,同時將其構造為雙向鍊錶,注意最後返回的根節點是中間節點,不是頭節點。
treenode* pre(treenode* root)
if (root->right !=
null)
}return root;
}treenode* convert(treenode* prootoftree)
其實就是在中序遍歷的非遞迴版中,用棧模擬遞迴,當前棧頂元素與上次彈出的元素構造雙向鍊錶,由於中序遍歷中上次彈出的元素必定是小於當前棧頂元素的,因此取上次彈出的元素與當前棧頂的元素構造雙向鍊錶能得到最終有序的雙向鍊錶。
關鍵在於非遞迴的中序遍歷的構造。
treenode* convert(treenode* prootoftree)
root = root->left;
}root = nodestack.top();
nodestack.pop();
// cout << root->val;
if (root != last)
root = root->right;
} while (!nodestack.empty()||root!=
null);
while (last->left) last = last->left;
return last;
}
總的來說,不管遞迴還是非遞迴,理解上都有一點難度。遞迴直觀但要注意邊界條件,遞迴轉非遞迴的寫法需要多多斟酌。 二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
Java實現二叉樹 雙鏈表
雙鏈表 public class mydoublelink implements iterable private node head 頭節點 private node rear 尾節點 private int modcount 0 從鍊錶的後面新增資料 param data public void...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...