二叉樹鏡像(遞迴與非遞迴)

來源:互聯網
上載者:User
題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。如下圖所示:右邊的二叉樹就是左邊的樹的鏡像。我們可以根據照鏡子的經驗畫出它的鏡像。遞迴思想:這兩棵樹的根節點相同,但是他們的左右孩子交換了。首先,我們交換根節點的兩個孩子,然後遞迴的處理根節點孩子的孩子。代碼如下:
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);}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.