二叉排序樹轉變成排序的雙向連結串列
阿新 • • 發佈:2019-01-26
一、問題描述
輸入一棵二叉查詢樹,將該二叉查詢樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只調整指標的指向。
【舉例】
10
/ \
6 14
/ \ / \
4 8 12 16
轉換成雙向連結串列
4=6=8=10=12=14=16
二、解題思路
題目要求不能建立任何新的結點,只需要調整指標的指向,那麼就意味著可直接利用二叉樹的結點,通過變更結點的左右孩子的指向,來生成雙鏈表的邏輯關係。問題就變成了:
找當前root結點的左孩子最大的結點left_max,和找當前root結點的右孩子最大的結點right_max然後變更各自的指向,依次遞迴,然後變更指標指向關係:
left_max->rchild = root - root->lchild = left_max
right_max->lchild = root - root->rchild = right_max
三、解題演算法
/****************************************** author:tmw date:2018-10-25 ******************************************/ #include <stdio.h> #include <stdlib.h> typedef struct BiTreeNode { int data; struct BiTreeNode* lchild; struct BiTreeNode* rchild; }BiTreeNode; BiTreeNode* Tree2Dlink(BiTreeNode* root) { if(root == NULL) return NULL; BiTreeNode* leftMax = root->lchild; BiTreeNode* rightMin = root->rchild; /**找到當前root結點排序後的前後兩個元素**/ while(leftMax!=NULL && leftMax->rchild!=NULL) leftMax = leftMax->rchild; while(rightMin!=NULL && rightMin->lchild!=NULL) rightMin = rightMin->lchild; /**分別對左右子樹做遞迴**/ Tree2Dlink(root->lchild); Tree2Dlink(root->rchild); /**變更指向,注意考慮空節點的情況**/ if(leftMax!=NULL) leftMax->rchild = root; if(rightMin!=NULL) rightMin->lchild = root; root->lchild = leftMax; root->rchild = rightMin; return root; }
夢想還是要有的,萬一實現了呢~~~~~~~~ヾ(◍°∇°◍)ノ゙~~~~~