給定乙個二叉樹,原地將它展開為乙個單鏈表。
仔細看題解可以知道,先序遍歷的順序就是鍊錶的元素順序,直接先序遍歷,用乙個陣列儲存先序遍歷結果。
遞迴版
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
}void
dfs(treenode* root, vector>
& l)}}
;
迭代版
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
}for
(int i =
1; i < l.
size()
; i++)}
};
利用遞迴先序遍歷,棧可以保持右子節點資訊,直接遍歷原地轉換。
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
if(tmp !=
nullptr)if
(tmp -
> left !=
nullptr)}
pre = tmp;}}
};
對於當前節點,如果其左子節點不為空,則在其左子樹中找到最右邊的節點,作為前驅節點,將當前節點的右子節點賦給前驅節點的右子節點,然後將當前節點的左子節點賦給當前節點的右子節點,並將當前節點的左子節點設為空。對當前節點處理結束後,繼續處理鍊錶中的下乙個節點,直到所有節點都處理結束。
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
pre -
> right = cur -
> right;
cur -
> left =
nullptr
; cur -
> right = next;
} cur = cur -
> right;}}
};
114 二叉樹展開為鍊錶
首先是原地演算法的定義 演算法原地工作的含義是指不需要任何額外的輔助,演算法所需要的輔助空間不隨著問題的規模而變化,是乙個確定的值。通過觀察示例可以知道,我們可以猜想,大方向是前序遍歷。第一種思路 dfs。設定乙個全域性的指標 這種做法有點脫離原地演算法,因為多開闢了乙個指標變數 核心思想是拿到乙個...
114 二叉樹展開為鍊錶
一開始寫的 114 二叉樹展開為鍊錶 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none class solution def flatt...
114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6思路 從題目可以看出來要求先根遍歷。從根節點開始出發,先檢測其左子結點是否存在 1 找到左子結點最後面的右子節點 如果沒有,就是左子節點本身 2 將根節點和其右子節點斷開,把原右子節點連到原...