1. 程式人生 > >LeetCode226 翻轉二叉樹

LeetCode226 翻轉二叉樹

翻轉一棵二叉樹。

示例:

輸入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

輸出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

備註:
這個問題是受到 Max Howell 的 原問題 啟發的 :

谷歌:我們90%的工程師使用您編寫的軟體(Homebrew),但是您卻無法在面試時在白板上寫出翻轉二叉樹這道題,這太糟糕了。

 


 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 
*/ /* 演算法思想: 遞迴的方法,寫法非常簡潔,五行程式碼搞定,交換當前左右節點,並直接呼叫遞迴即可。 */ //演算法實現: class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return NULL TreeNode *tmp = root->left; root->left = invertTree(root->right); root
->right = invertTree(tmp); return root; } }; /* 演算法思想: 非遞迴的方法也不復雜,跟二叉樹的層序遍歷一樣,需要用queue來輔助,先把根節點加入佇列中,然後從隊中取出來,交換其左右節點,如果存在則分別將左右節點在加入佇列中,以此類推直到佇列中沒有節點了停止迴圈,返回root即可。 */ //演算法實現: class Solution { public: TreeNode* invertTree(TreeNode* root) { if (!root)
return NULL; queue<TreeNode*> q; q.push(root); while (!q.empty()) { TreeNode *node = q.front(); q.pop(); TreeNode *tmp = node->left; node->left = node->right; node->right = tmp; if (node->left) q.push(node->left); if (node->right) q.push(node->right); } return root; } };