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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

二叉树的线索化

發(fā)布時間:2024/8/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的线索化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞歸或者用棧輔助實現(xiàn)非遞歸的遍歷。二叉樹作為存儲結構時,一個節(jié)點只能獲取節(jié)點的左孩子和右孩子,不能直接得到節(jié)點的任一遍歷序列的前驅(qū)或者后繼。為了保存這種在遍歷中需要的信息,我們利用二叉樹中指向左右子樹的空指針來存放節(jié)點的前驅(qū)或后繼信息。

也就是說,線索二叉樹就是充分利用二叉樹節(jié)點中的空指針,讓它們分別指向本節(jié)點的前驅(qū)或者后繼。既充分利用了資源,又方便我們遍歷這顆二叉樹。

1、線索二叉樹的概念

n個節(jié)點的二叉樹中含有n+1個空指針域。利用二叉樹中的空指針域 來存放在某種遍歷次序下的前驅(qū)和后繼?,這種指針叫“線索”。這種加上了線索的二叉樹稱為線索二叉樹(Threaded BinaryTree)。根據(jù)遍歷次序的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和后序線索二叉樹三種。

2、線索二叉樹結構定義

/*線索化二叉樹的結構*/ enum Flag {LINK,CLUE };struct TreeNode {TreeNode(int x) : value(x), left(NULL), right(NULL), left_flag(LINK), right_flag(LINK) {};int value;TreeNode *left;TreeNode *right;Flag left_flag;Flag right_flag; };

value???left? ??left_flagright? ??right_flag
?

?3、前序線索二叉樹實現(xiàn)

/*前序遍歷的構建*/ void prevCreate(TreeNode *root, TreeNode *&prev) //&prev用引用,相當于全局變量的作用,在整個遞歸過程傳遞 {if(root){if(root->left == NULL){root->left_flag = CLUE;root->left = prev;}if(prev && prev->right == NULL){prev->right_flag = CLUE;prev->right = root;}prev = root;if(!root->left_flag){prevCreate(root->left, prev);}prevCreate(root->right, prev);} }

/*前序線索下的遍歷*/ void prevOrder(TreeNode *root) {while(root){while(root->left_flag != CLUE){cout << root->value << " ";root = root->left;}cout << root->value << " ";root = root->right;}cout << endl; }


?4、中序線索二叉樹實現(xiàn)

/*中序遍歷的構建*/ void inCreate(TreeNode *root, TreeNode *&prev) {if(root){inCreate(root->left, prev);if(root->left == NULL){root->left_flag = CLUE;root->left = prev;}if(prev && prev->right == NULL){prev->right_flag = CLUE;prev->right = root;}prev = root;inCreate(root->right, prev);} }

/*中序線索下的遍歷*/ void inOrder(TreeNode *root) {while(root){while(root->left_flag != CLUE)root = root->left;cout << root->value << " ";while(root->right_flag != LINK){root = root->right;cout << root->value << " ";}root = root->right;}cout << endl; }


?5、線索化思想拓展

題目:如何將一個二叉樹轉(zhuǎn)化成一個有序的雙向鏈表?

在沒有學線索化之前,這道題可能非常麻煩。但現(xiàn)在,利用中序線索化的思想就可以很快將這道題做出來!

/*利用中序線索化思想將二叉樹轉(zhuǎn)換成有序的雙向鏈表*/ void TreeToList(TreeNode *root) {static TreeNode *prev = NULL; //設立prev保存上一次訪問的節(jié)點if(root == NULL) //根節(jié)點為空,直接返回return;TreeToList(root->left); //遞歸左子樹root->left = prev; //讓左指針指向上一次訪問的節(jié)點,即前驅(qū)if(prev)prev->right = root; //讓prev指向當前節(jié)點,構成雙向prev = root; //更新prevTreeToList(root->right); //遞歸右子樹 }

?

本博文參考https://www.cnblogs.com/shihaochangeworld/p/5473163.html

?

轉(zhuǎn)載于:https://www.cnblogs.com/evenleee/p/8488277.html

總結

以上是生活随笔為你收集整理的二叉树的线索化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。