題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。如下圖所示:右邊的二叉樹就是左邊的樹的鏡像。我們可以根據照鏡子的經驗畫出它的鏡像。遞迴思想:這兩棵樹的根節點相同,但是他們的左右孩子交換了。首先,我們交換根節點的兩個孩子,然後遞迴的處理根節點孩子的孩子。代碼如下:
void mirror01(BinaryTreeNode *root){if(root == NULL)//處理的當前節點為空白return;if(root->left == NULL && root->right == NULL)//處理葉子節點return;swap(root->left,root->right);//交換左右孩子if(root->left != NULL)//進入左孩子mirror01(root->left);if(root->right != NULL)//進入右孩子mirror01(root->right);}非遞迴的思想:我們按照廣度遍曆二叉樹的順序,逐個處理遍曆的節點。當處理的當前節點,如果有孩子節點,我們交換它們的孩子節點,並且把它們的非空孩子入隊列。處理完當前節點以後,我們下一次處理隊頭的節點。
void mirror01(BinaryTreeNode *&root){queue<BinaryTreeNode *> q;BinaryTreeNode *pointer = root;//當前處理的節點為根節點while (pointer){swap(pointer->left, pointer->right);//交換當前處理節點的孩子if (pointer->left)//左孩子不為空白q.push(pointer->left);if (pointer->right)//右孩子不為空白q.push(pointer->right);if (!q.empty()){pointer = q.front();q.pop();}else{break;}}}非遞迴思想:我們也可以按照先序遍曆二叉樹的順序,非遞迴的實現二叉樹的鏡像操作,每遇到一個節點,判斷當前節點是否有孩子,如果有孩子,我們交換其左右孩子,然後把非空孩子入棧。直到隊列為空白。
void mirror02(BinaryTreeNode *root){if (root == NULL)//如果處理的空樹,我們直接返回return;stack<BinaryTreeNode*> s;//建立一個棧s.push(root);BinaryTreeNode *pointer = NULL;while (!s.empty()){pointer = s.top();//取出棧頂元素s.pop();if (pointer->left != NULL || pointer->right != NULL)//非葉子節點{swap(pointer->left,pointer->right);//交換其左右孩子}if (pointer->left != NULL)//非空左子樹入棧s.push(pointer->left);if (pointer->right != NULL)//非空右子樹入棧s.push(pointer->right);}}