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

175 翻轉二叉樹

問題 span 解決 tag mar tro ble code btn

原題網址:https://www.lintcode.com/problem/invert-binary-tree/description

描述

翻轉一棵二叉樹

您在真實的面試中是否遇到過這個題?

樣例

  1         1
 / \       / 2   3  => 3   2
   /         4         4

挑戰

遞歸固然可行,能否寫個非遞歸的?

標簽 二叉樹 遞歸思路:二叉樹相關的問題用遞歸解決是相對容易理解的,盡管我對遞歸很懵比……遞歸,問題要麽在遞去過程中解決,要麽在歸來過程中解決。這道題是翻轉二叉樹,從遠離根的末梢開始,先翻轉左右孩子均是葉子結點(包括NULL)的父節點,再向上返回翻轉以該父節點為左(右)孩子的祖父結點……以此類推。可以看出,問題是在歸來過程中解決的。
PS:本題還可以在遞去過程中解決,先翻轉上面的一層,再翻轉下面的,從上到下。即把交換語句塊放到遞歸語句塊前面。 AC代碼:
/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class
Solution { public: /** * @param root: a TreeNode, the root of the binary tree * @return: nothing */ void invertBinaryTree(TreeNode * root) { // write your code here if (root==NULL) { return ; } invertBinaryTree(root->left); invertBinaryTree(root
->right); TreeNode *temp=root->right; root->right=root->left; root->left=temp; } };

非遞歸:廣度優先搜索。從根開始一層層遍歷,交換結點的左右孩子。

AC代碼:
/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: a TreeNode, the root of the binary tree
     * @return: nothing
     */
    void invertBinaryTree(TreeNode * root) {
        // write your code here
    if (root==NULL)
    {
        return ;
    }
    queue<TreeNode *> tmp;
    tmp.push(root);
    while(!tmp.empty())
    {
        TreeNode *p=tmp.front();
        tmp.pop();
        swap(p->left,p->right);
        if (p->left!=NULL)
        {
            tmp.push(p->left);
        }
        if (p->right!=NULL)
        {
            tmp.push(p->right);
        }
    }
    }
};

175 翻轉二叉樹