1. 程式人生 > >453 將二叉樹拆成鏈表

453 將二叉樹拆成鏈表

ren his flat AD per tro header not scrip

原題網址:https://www.lintcode.com/problem/flatten-binary-tree-to-linked-list/description

描述

將一棵二叉樹按照前序遍歷拆解成為一個假鏈表。所謂的假鏈表是說,用二叉樹的 right 指針,來表示鏈表中的 next 指針。

不要忘記將左兒子標記為 null,否則你可能會得到空間溢出或是時間溢出。

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

樣例

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

挑戰

不使用額外的空間耗費。

標簽 二叉樹 Depth-first Search(DFS) 非挑戰思路 1.前序遍歷,將節點地址保存在數組中。 2.創建鏈表:下標從1開始遍歷數組,將當前節點的right賦值為當前數組元素,同時當前節點left賦值NULL,再用right值更新當前節點。 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 flatten(TreeNode * root) { // write your code here if (root==NULL) { return ; } vector<TreeNode*> tmp; pretrav(tmp,root);
for (int i=1;i<(int)tmp.size();i++) { root->right=tmp[i]; root->left=NULL; root=root->right; } } void pretrav(vector<TreeNode*> &tmp,TreeNode * root) { if (root==NULL) { return ; } tmp.push_back(root); pretrav(tmp,root->left); pretrav(tmp,root->right); } };

453 將二叉樹拆成鏈表