Leetcode114二叉树转链表-树中修改
生活随笔
收集整理的這篇文章主要介紹了
Leetcode114二叉树转链表-树中修改
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定一個二叉樹,原地將它展開為鏈表。
百度百科:在計算機科學中,一個原地算法(in-place algorithm)是一種使用小的,固定數量的額外之空間來轉換資料的算法。當算法執行時,輸入的資料通常會被要輸出的部份覆蓋掉。不是原地算法有時候稱為非原地(not-in-place)或不得其所(out-of-place)。
例如,給定二叉樹
1/ \2 5/ \ \ 3 4 6將其展開為:
1\2\3\4\5\6思路
這里使用前序遍歷:根節點-左子樹-右子樹。
左子樹轉化為鏈表,需要該鏈表的尾部指針,連接右子樹(的鏈表)的頭部指針。
同樣右子樹轉化為鏈表,也需要尾部指針,因為存在葉節點是右孩子的情況,需要連接到另外的節點。比如下圖中的7,對于前序遍歷 ,7需要連接到4.
二叉樹就地變成鏈表,需要node->left=NULL;node->right指向下一節點。
遞歸的思想,我們考慮任意節點的遞歸具體實現。
對于任何一個節點,如果沒有左子樹和右子樹,則鏈表尾部是該結點指針。
如果存在左子樹,和右子樹需要考慮遞歸遍歷,同時傳出該子樹的尾部指針。
leetcode代碼
測試代碼
#include<iostream>#include<vector>using namespace std;struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeNode(int x):val(x),left(NULL),right(NULL){} };class solution{public:void flatten(TreeNode* root){TreeNode *last=NULL;preorder(root,last);//先序遍歷最后的一個節點,傳引用出來 }private:void preorder(TreeNode* node,TreeNode* &last){if(!node)return;if(!node->left&&!node->right)//遞歸返回的條件 {//葉節點 last=node;return;}TreeNode*left=node->left;TreeNode* right=node->right;TreeNode* left_last=NULL;TreeNode* right_last=NULL;if(left)//如果存在左子樹{preorder(left,left_last);//node->left=NULL;node->right=left;//轉化為鏈表last=left_last;//左子樹鏈表的最后的指針 } if(right)//如果存在右子樹{preorder(right,right_last);if(left_last)//當前節點的左子樹最后的指針存在 {left_last->right=right;//串聯左右子樹 } last=right_last;//右子樹的最后的指針 } } };int main(){//構造樹TreeNode a(1);TreeNode b(2);TreeNode c(5);TreeNode d(3);TreeNode e(4);TreeNode f(6);a.left=&b;a.right=&c;c.right=&f;b.left=&d;b.right=&e;solution solve;solve.flatten(&a);//TreeNode* head=&a;//當作鏈表來處理 while(head){if(head->left)//如果存在左指針,則說明轉化錯誤cout<<"wrong"<<endl;cout<<"["<<head->val<<"]";head=head->right;//右移}cout<<endl;return 0;}測試結果
題目來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
總結
以上是生活随笔為你收集整理的Leetcode114二叉树转链表-树中修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟手游会取代王者荣耀吗 腾讯旗下两
- 下一篇: 闪电贷需要什么条件才能通过