114. Flatten Binary Tree to Linked List的C++解法
阿新 • • 發佈:2019-01-02
題目描述:https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
這個題的關鍵是找到左右子樹的最右下角的位置,因為這將是下一次接子樹的起點。下面這個方法用了遞迴,假設左右子樹將在helper中接好,並且helper返回的是接好的子樹的最右下角的位置。
class Solution { public: void flatten(TreeNode* root) { helper(root); } TreeNode* helper(TreeNode* root){ if (root==NULL) return NULL; TreeNode* left=helper(root->left);// left記錄了root->left的最右下角的位置,用於接上root->right TreeNode* right=helper(root->right);//right 記錄了root->right最右下角的位置,拼接完成後這將是root的最右下角 if (left!=NULL) { left->right=root->right;//將右子樹接到左子樹最下面 root->right=root->left;//將整棵左子樹接到右子樹的位置 root->left=NULL; } if (right!=NULL) return right;//右子樹存在最右下角的位置則優先返回這個位置(因為這個位置將是最右的) if (left!=NULL) return left;//如果沒有右子樹的右下角,則左子樹的右下角是最後一個位置 return root;//都沒有就返回根 } };
更好的做法:
只有左邊還有子樹,就用一個指標遍歷到左邊子樹的最最右邊到底的一個節點,然後把root右邊子樹全部掛在這個節點上,然後再通過root->right = root -> left; root -> left = NULL; 消滅右邊子樹,然後root = root-> right;迴圈往復,不斷消滅右邊子樹。
class Solution { public: void flatten(TreeNode *root) { if (root == NULL) return; while (root) { if (root->left) { TreeNode *pre = root->left; while (pre->right) pre = pre->right; pre->right = root->right; root->right = root->left; root->left = NULL; } root = root->right; } } };