【演算法】輸入一顆二元查詢樹,將該樹轉換為它的映象
題目:輸入一棵二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。
要求:用遞迴和迴圈兩種方法完成樹的映象轉換。
舉例:
8 8 / \ 轉換 / \ 6 10 --> 10 6 / \ / \ / \ / \ 5 7 9 11 11 9 7 5
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
typedef struct node
{
int key;
struct node *pleft;
struct node *pright;
}Node;
int CreateTreeByInsertData(Node **p,int k)//理解為什麼用二級指標
{
if(*p==NULL)
{
*p=(Node *)malloc(sizeof(Node));
(*p)->key=k;
(*p)->pleft=(*p)->pright=NULL;
return 1;
}
else if(k == (*p)->key)
return 0;
else if(k < (*p)->key)
return CreateTreeByInsertData(&(*p)->pleft,k);
else
return CreateTreeByInsertData(&(*p)->pright,k);
}
void swap(Node **l, Node **r)
{
Node *p = *l;
*l = *r;
*r = p;
}
void mirror(Node *root)//遞迴來使得映象對稱
{
if(root == NULL)
return;
swap( &(root->pleft), &(root->pright));
mirror(root->pleft);
mirror(root->pright);
}
void mirrorByStack(Node *root)//用棧來做得映象對稱
{
stack<Node *>myStack;
if(root == NULL)
return;
myStack.push(root);
while(!myStack.empty())
{
Node *p = myStack.top();//取得棧頂元素
myStack.pop();//只是彈出,刪除,並不能取到棧頂元素
swap( &(p->pleft), &(p->pright));
if(p->pleft!=NULL)
myStack.push(p->pleft);
if(p->pright!=NULL)
myStack.push(p->pright);
}
}
void visitByLevel(Node *p)//層次遍歷,上到下,左到右
{
queue<Node*> myQueue;
if(p == NULL)
return;
myQueue.push(p);
while(!myQueue.empty())
{
Node *now = myQueue.front();
myQueue.pop();
printf("%d ",now->key);
if(now->pleft) myQueue.push(now->pleft);
if(now->pright) myQueue.push(now->pright);
}
printf("\n");
}
void ClearTree(Node** tree)//刪除樹的操作,在本題中不一定用的到
{
if(*tree==NULL)return;
ClearTree(&(*tree)->pleft);
ClearTree(&(*tree)->pright);
free(*tree);
*tree=NULL;
}
int main()
{
int i;
Node *proot = NULL;
int data[] = {8,6,10,5,7,9,11};
//依次插入一些資料,建立一個二叉排序樹
for(i=0; i<sizeof(data)/sizeof(int); i++)
CreateTreeByInsertData(&proot, data[i]);
visitByLevel(proot);//8 6 10 5 7 9 11
mirror(proot);
visitByLevel(proot);//8 10 6 11 9 7 5
mirrorByStack(proot);
visitByLevel(proot);//8 6 10 5 7 9 11
ClearTree(&proot);
return 0;
}
相關文章
- 【演算法】輸入一顆二元樹,從上往下按層列印樹的每個結點,同一層中按照從左往右的順序列印演算法
- 檢驗一顆樹是不是另一顆樹的子結構
- mysql樹狀查詢(轉)MySql
- 建立一顆二叉樹,並求它的高度 7074二叉樹
- B樹(多路查詢樹)
- 一個簡單的樹查詢
- 【演算法】在二元樹中找出和為某一值的所有路徑演算法
- 多路查詢樹
- 平衡查詢樹
- oracle 樹查詢Oracle
- 樹形查詢
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 【演算法】判斷整數序列是不是二元查詢樹的後序遍歷結果演算法
- Hash連結串列轉換為紅黑樹,和樹轉換為連結串列的條件
- 查詢|有序表折半查詢判定樹|二叉排序樹|3階B-樹排序
- oracle樹形查詢Oracle
- #查詢演算法#【2】二叉排序樹演算法排序
- 多路查詢樹(2-3 樹、2-3-4 樹、B 樹、B+ 樹)
- 刷題系列 - 在二叉樹中查詢給出節點,並返回以該節點為根的樹二叉樹
- B樹查詢,磁碟查詢資料
- 平衡二叉查詢樹:紅黑樹
- 二叉樹 & 二叉查詢樹二叉樹
- 二叉查詢樹和笛卡爾樹
- 將Lucene搜尋查詢轉換為.NET的EF表示式
- 查詢二叉樹二叉樹
- 二叉查詢樹
- 樹莓派CM4(四):樹莓派映象替換核心樹莓派
- 關於樹結構的查詢優化,及許可權樹的查詢優化優化
- (轉)SQL查詢案例:多行轉換為一行SQL
- 二叉查詢樹(二叉排序樹)排序
- 淺談演算法和資料結構(10):平衡查詢樹之B樹演算法資料結構
- 二叉查詢樹的插入刪除查詢
- [資料結構] BFS演算法實現層序遍歷輸出一顆二叉樹資料結構演算法二叉樹
- 淺談演算法和資料結構(9):平衡查詢樹之紅黑樹演算法資料結構
- Python教程:將有序陣列轉換為二叉搜尋樹Python陣列
- BZOJ 3589 動態樹(子樹操作,鏈查詢)
- 手擼二叉樹——二叉查詢樹二叉樹
- 將List物件列表轉為樹形結構物件