力扣226 翻轉二叉樹(遞迴)

2021-10-25 07:14:22 字數 2212 閱讀 6487

力扣226. 翻轉二叉樹(遞迴)

翻轉一棵二叉樹。

示例:輸入:

4/   \

2     7

/ \   / \

1   3 6   9

輸出:4

/   \

7     2

/ \   / \

9   6 3   1

「1. 定義函式功能」

函式功能(即這個遞迴原問題是),給出一顆樹,然後翻轉它,所以,函式可以定義為:

listnode* reverselist(listnode* head)

「2.尋找遞迴終止條件」

這棵樹什麼時候不用翻轉呢?當然是當前節點為null或者當前節點為葉子節點的時候啦。因此,加上終止條件就是:

root==null || (root.left ==null && root.right ==null

「3. 遞推函式的等價關係式」

原問題之你要翻轉一顆樹,是不是可以拆分為子問題,分別翻轉它的左子樹和右子樹?子問題之翻轉它的左子樹,是不是又可以拆分為,翻轉它左子樹的左子樹以及它左子樹的右子樹?然後一直翻轉到葉子節點為止。嗯,看圖理解一下咯~

首先,你要翻轉根節點為4的樹,就需要「翻轉它的左子樹(根節點為2)和右子樹(根節點為7)」。這就是遞迴的「遞」的過程啦

然後呢,根節點為2的樹,不是葉子節點,你需要繼續「翻轉它的左子樹(根節點為1)和右子樹(根節點為3)」。因為節點1和3都是「葉子節點」了,所以就返回啦。這也是遞迴的「遞」的過程~

同理,根節點為7的樹,也不是葉子節點,你需要翻轉「它的左子樹(根節點為6)和右子樹(根節點為9)」。因為節點6和9都是葉子節點了,所以也返回啦。

左子樹(根節點為2)和右子樹(根節點為7)都被翻轉完後,這幾個步驟就「歸來」,即遞迴的歸過程,翻轉樹的任務就完成了~

顯然,「遞推關係式」就是:

inverttree(root)= inverttree(root.left) + inverttree(root.right);

這裡**有個地方需要注意,翻轉完一棵樹的左右子樹,還要交換它左右子樹的引用位置。 root.left = right; root.right = left;

//

// main.cpp

// 226inverttree

//// created by mxq on 2020/10/27.

//#include using namespace std;

//definition for a binary tree node.

struct treenode

};class solution

};int main(int argc, const char * ar**) ;

root[0].left=&root[1];

root[0].right=&root[2];

root[1].left=&root[3];

root[1].right=&root[4];

root[2].left=&root[5];

root[2].right=&root[6];

solution s;

auto result=s.inverttree(root);

std::cout << "hello, world!\n";

return 0;

}

226 翻轉二叉樹

翻轉一棵二叉樹。示例 輸入 4 2 7 1 3 6 9 輸出 4 7 2 9 6 3 1 備註 這個問題是受到 max howell 的 原問題 啟發的 谷歌 我們90 的工程師使用您編寫的軟體 homebrew 但是您卻無法在面試時在白板上寫出翻轉二叉樹這道題,這太糟糕了。class soluti...

226 翻轉二叉樹

解題思路 看到題目就會想到要左右節點交換,但是糾結了很久的問題是在遞迴左右節點時要不要判斷左右節點為空,後來看了別人的解題思路想到了,其實不用判斷,不管是否為空都要左右節點交換。至於root為空時,root.left是否合理的問題,更不用考慮了,因為root.left是通過別的值儲存起來的,且roo...

226 翻轉二叉樹

翻轉一棵二叉樹。示例 輸入 輸出 翻轉一顆空樹還是空樹,因此,對於每乙個節點,分別翻轉它的子樹,把該節點的左右子樹交換,遞迴的翻轉所有節點。definition for a binary tree node.struct treenode class solution treenode left i...