日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode114二叉树转链表-树中修改

發布時間:2025/4/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.

1/ \2 5/ \ \3 4 6\7

二叉樹就地變成鏈表,需要node->left=NULL;node->right指向下一節點。

遞歸的思想,我們考慮任意節點的遞歸具體實現。
對于任何一個節點,如果沒有左子樹和右子樹,則鏈表尾部是該結點指針。
如果存在左子樹,和右子樹需要考慮遞歸遍歷,同時傳出該子樹的尾部指針。
leetcode代碼

/*** Definition for a binary tree node.* 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;//右子樹的最后的指針 } } };

測試代碼

#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二叉树转链表-树中修改的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。