(Tree)二叉树基本操作
生活随笔
收集整理的這篇文章主要介紹了
(Tree)二叉树基本操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//二叉樹操作#include<iostream>
#include<algorithm>
using namespace std;//準備數據#define MANLEN 20
typedef char DATA;
typedef struct CBT
{DATA data;struct CBT*left;struct CBT*right;
}CBTT;//初始二叉樹,設置一個根節點CBTT* InitTree()
{CBTT* node;if (node = (CBTT*)malloc(sizeof(CBTT))){cout << "請先輸入一個根節點數據: " << endl;cin >> node->data;node->left = nullptr;node->right = nullptr;if (node != nullptr){return node;}else{return nullptr;}return nullptr;}
}//添加結點
void AddTreeNode(CBTT* treeNode)
{CBTT* pnode, *parent;DATA data;char menusel;if (pnode = (CBTT*)malloc(sizeof(CBTT))){cout << "請輸入要加入的數據: " << endl;cin >> pnode->data;pnode->left = nullptr;pnode->right = nullptr;cout << "請輸入該結點的父結點數據: " << endl;fflush(stdin);cin >> data;parent = TreeFindNode(treeNode, data);if (!parent){cout << "未找到該父節點!" << endl;free(pnode);return;}cout << "1.添加到左子樹 \n 2.添加到右子樹" << endl;do{menusel = getchar();menusel = '0';if (menusel == 1 || menusel == 2){if (parent == nullptr){cout << "不存在父結點,請先設置父結點" << endl;}else{switch (menusel){case 1:if (parent->left){cout << "左子樹不為空" << endl;}else{parent->left = pnode;}break;case 2:if (parent->right){cout << "右子樹不為空" << endl;}else{parent->right = pnode;}break;default:cout << "無效參數" << endl;}}}} while (menusel!=1 && menusel!=2);}}//查找結點,先判斷根是否為空然后遞歸查找左右子樹
CBTT* TreeFindNode(CBTT* treeNode, DATA data)
{CBTT* ptr;if (treeNode == nullptr){return nullptr;}else{if (treeNode->data == data){return treeNode;}else{if (ptr = TreeFindNode(treeNode->left)){return ptr;}else if (ptr = TreeFindNode(treeNode->right)){return ptr;}else{return nullptr;}}}
}//獲取左子樹
CBTT* TreeLeftNode(CBTT* treeNode)
{if (treeNode){return treeNode->left;}else{return nullptr;}}//獲取右子樹
CBTT* TreeRightNode(CBTT* treeNode)
{if (treeNode){return treeNode->right;}else{return nullptr;}}//計算二叉樹的深度
int TreeDepth(CBTT* treeNode)
{int depleft, depright;if (treeNode == nullptr){return 0;}else{depleft = TreeDepth(treeNode->left);depright = TreeDepth(treeNode->right);if (depleft > depright){return depleft + 1;}else{return depright + 1;}}
}//清空二叉樹
void ClearTree(CBTT* treeNode)
{if (treeNode){ClearTree(treeNode->left);ClearTree(treeNode->right);free(treeNode);treeNode = nullptr;}
}//前序遍歷void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;cout << treeNode->data;preorderTrav(treeNode->left);preorderTrav(treeNode->right);
}//中序遍歷void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;preorderTrav(treeNode->left);cout << treeNode->data;preorderTrav(treeNode->right);
}//后續遍歷void preorderTrav(CBTT* treeNode)
{if (treeNode == nullptr)return;preorderTrav(treeNode->left);preorderTrav(treeNode->right);cout << treeNode->data;
}//求二叉樹高度
int getTreeHigh(CBTT* root)
{if (root == NULL)return 0;int left_high = getTreeHigh(root->left);int right_high = getTreeHigh(root->right);return max(left_high, right_high) + 1;
}
?
總結
以上是生活随笔為你收集整理的(Tree)二叉树基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 励志名字网名大全82个
- 下一篇: LeetCode 206. 反转链表