完全二叉树基本操作(不含遍历)
生活随笔
收集整理的這篇文章主要介紹了
完全二叉树基本操作(不含遍历)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*準(zhǔn)備數(shù)據(jù)*/#define MANLEN 20 //最大長(zhǎng)度
typedef char DATA; //定義元素類型
typedef struct CBT //定義二叉樹結(jié)點(diǎn)類型
{DATA data; //元素?cái)?shù)據(jù)struct CBT* left; //左子樹結(jié)點(diǎn)指針struct CBT* right; //右子樹結(jié)點(diǎn)指針
}CBTType;/*初始化二叉樹*/
CBTType* InitTree() //初始化二叉樹的根
{CBTType* node;if (node = (CBTType*)malloc(sizeof(CBTType)))//申請(qǐng)內(nèi)存{cout << "請(qǐng)輸入一個(gè)結(jié)點(diǎn)的數(shù)據(jù): " << endl;cin>> node->data;node->left = NULL;node->right = NULL;if (node != NULL){return node;}else{return NULL;}}return NULL;
}/*添加結(jié)點(diǎn)*/void AddTreeNode(CBTType* treeNode)
{CBTType *pnode, *parent;DATA data;char menusel;if (pnode = (CBTType*)malloc(sizeof(CBTType))){cout << "請(qǐng)輸入二叉樹結(jié)點(diǎn)數(shù)據(jù): " << endl;fflush(stdin);cin >> pnode->data;pnode->left = NULL;pnode->right = NULL;cout << "請(qǐng)輸入該結(jié)點(diǎn)的父結(jié)點(diǎn)數(shù)據(jù): ";fflush(stdin);cin >> data;parent = TreeFindNode(treeNode, data);if (!parent){cout << "未找到父結(jié)點(diǎn)!";free(pnode);return;}cout << ("1.添加該結(jié)點(diǎn)到左子樹\n2.添加該結(jié)點(diǎn)到右子樹\n");do{menusel = getchar();menusel -= '0';if (menusel == 1 || menusel == 2){if (parent == NULL){cout << "不存在父結(jié)點(diǎn),請(qǐng)先設(shè)置父節(jié)點(diǎn)!" <<endl;}else{switch (menusel){case 1:if (parent->left){cout << "左子樹結(jié)點(diǎn)不為空"<<endl;}else{parent->left = pnode;}break;case 2:if (parent->right){cout << "又子樹結(jié)點(diǎn)不為空" << endl;}else{parent->right = pnode;}break;default:cout << "參數(shù)無效" << endl;}}}} while (menusel!=1 && menusel!=2);}
}/*查找結(jié)點(diǎn)*/CBTType* TreeFindNode(CBTType* treenode, DATA data)
{CBTType* ptr;if (treenode == NULL){return NULL;}else{if (treenode->data == data){return treenode;}else{if (ptr = TreeFindNode(treenode->left, data)){return ptr;}else if (ptr=TreeFindNode(treenode->right,ENODATA)){return ptr;}else //分別向左右子數(shù)遞歸查找{return NULL;}}}
}/*獲取左子樹*/CBTType* TreeLeftNode(CBTType* treenode)
{if (treenode){return treenode->left;}else{return NULL;}
}/*獲取右子樹*/CBTType* TreeLeftNode(CBTType* treenode)
{if (treenode){return treenode->right;}else{return NULL;}
}/*判斷空樹*/int TreeIsEmpty(CBTType* treenose)
{if (treenose){return 0;}else{return 1;}
}/*計(jì)算二叉樹的深度*/
//計(jì)算深度就是就算二叉樹中結(jié)點(diǎn)最大的層數(shù),往往需要采用遞歸算法實(shí)現(xiàn)int TreeDepth(CBTType* treenode)
{int depleft, depright;if (treenode == NULL){return 0;}else{depleft = TreeDepth(treenode->left); //左子樹深度(遞歸調(diào)用)depright = TreeDepth(treenode->right); //右子樹深度(遞歸調(diào)用)if (depleft > depright){return depleft + 1;}else{return depright + 1;}}
}/*清空二叉樹*/
/*使用遞歸*/void ClearTree(CBTType* treenode)
{if (treenode){ClearTree(treenode->left); //清空左子樹ClearTree(treenode->right); //清空右子樹free(treenode); //釋放當(dāng)前結(jié)點(diǎn)所占內(nèi)存treenode = NULL;}
}/*顯示結(jié)點(diǎn)數(shù)據(jù)*/
//顯示結(jié)點(diǎn)數(shù)據(jù)就是顯示當(dāng)前結(jié)點(diǎn)的數(shù)據(jù)void TreeNodeData(CBTType* p)
{cout << p->data << endl;
}
//參數(shù)p為帶顯示的結(jié)點(diǎn)
?
總結(jié)
以上是生活随笔為你收集整理的完全二叉树基本操作(不含遍历)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于历史的名言名句160个
- 下一篇: 算法:删除顺序表中重复的元素