LeetCode 114 二叉樹展開為鍊錶

2021-10-19 16:05:50 字數 1686 閱讀 1861

題目描述:

給你二叉樹的根結點 root ,請你將它展開為乙個單鏈表:

展開後的單鏈表應該同樣使用 treenode ,其中 right 子指標指向鍊錶中下乙個結點,而左子指標始終為 null 。

展開後的單鏈表應該與二叉樹 先序遍歷 順序相同。

示例:

輸入:root = [1,2,5,3,4,null,6]輸出:[1,null,2,null,3,null,4,null,5,null,6]
輸入:root =輸出:
思路分析:函式為:

void flatten(treenode root);
我們嘗試給出這個函式的定義:

flatten函式輸入乙個節點root,那麼以root為根的二叉樹就會被拉平為一條鍊錶

我們再梳理一下,如何按題目要求把一棵樹拉平成一條鍊錶?很簡單,以下流程:

1、將root的左子樹和右子樹拉平。

2、將root的右子樹接到左子樹下方,然後將整個左子樹作為右子樹。

上面三步看起來最難的應該是第一步對吧,如何把root的左右子樹拉平?其實很簡單,按照flatten函式的定義,對root的左右子樹遞迴呼叫flatten函式即可:

/**

* definition for a binary tree node.

* public class treenode

* treenode(int val)

* treenode(int val, treenode left, treenode right)

* }*/class solution

flatten(root.left);

flatten(root.right);

/**** 後序遍歷位置 ****/

// 1、左右子樹已經被拉平成一條鍊錶

treenode left=root.left;

treenode right=root.right;

// 2、將左子樹作為右子樹

root.left=null;

root.right=left;

// 3、將原先的右子樹接到當前右子樹的末端

treenode p=root;

while(p.right!=null)

p.right=right;}}

你看,這就是遞迴的魅力,你說flatten函式是怎麼把左右子樹拉平的?說不清楚,但是只要知道flatten的定義如此,相信這個定義,讓root做它該做的事情,然後flatten函式就會按照定義工作。另外注意遞迴框架是後序遍歷,因為我們要先拉平左右子樹才能進行後續操作。

leetcode114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。先把左右展開,右放左最後,左放右,左置空 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none clas...

Leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 複製 將其展開為 1 2 3 4 5 6 複製 這算是比較經典的一道題目了,博主面試快手的時候原題。最開始一想,覺得遞迴的求解不就好了,但是遞迴的時候發現需要注意乙個地方就是 需要先遞迴右子樹,然後記錄下右子樹展開完成之後...

leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6採用二叉樹後序遍歷 python 如下 class treenode object def init self,x self.val x self.left none self.right ...