劍指offer66題--Java實現,c++實現和python實現 26.二叉搜尋樹與雙向連結串列
阿新 • • 發佈:2018-12-29
題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
C++
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == nullptr) return nullptr; TreeNode* pre = nullptr; convertHelper(pRootOfTree, pre); TreeNode* res = pRootOfTree; while(res ->left) res = res ->left; return res; } void convertHelper(TreeNode* cur, TreeNode*& pre) { if(cur == nullptr) return; convertHelper(cur ->left, pre); cur ->left = pre; if(pre) pre ->right = cur; pre = cur; convertHelper(cur ->right, pre); } };
java
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { private TreeNode leftHead = null; private TreeNode rightHead = null; public TreeNode Convert(TreeNode pRootOfTree) { if (pRootOfTree == null) return null; Convert(pRootOfTree.left); if (leftHead == null) { leftHead = pRootOfTree; rightHead = pRootOfTree; } else { rightHead.right = pRootOfTree; pRootOfTree.left = rightHead; rightHead = pRootOfTree; } Convert(pRootOfTree.right); return leftHead; } }
python
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def Convert(self,pRootOfTree): if pRootOfTree == None: return None if not pRootOfTree.left and not pRootOfTree.right: return pRootOfTree left = pRootOfTree.left if left: self.Convert(left) while left.right: left = left.right pRootOfTree.left,left.right = left,pRootOfTree right = pRootOfTree.right if right: self.Convert(right) while right.left: right = right.left pRootOfTree.right, right.left = right,pRootOfTree while pRootOfTree.left: pRootOfTree = pRootOfTree.left return pRootOfTree