链式Tree->二叉搜索树
来源:互联网 发布:在淘宝上怎么开直播 编辑:程序博客网 时间:2024/05/06 15:55
// http://blog.csdn.net/fansongy/article/details/6798278/ #include <iostream> #include <vector> using namespace std; typedef struct treenode { int data; struct treenode *left; struct treenode *right; }TREE_NODE;//节点 typedef struct Bstree { TREE_NODE* root; int size; }BSTREE;//二叉树 BSTREE* create_tree() //创建 { BSTREE* tree = new(BSTREE); tree->root = NULL; tree->size = 0; return tree; } TREE_NODE* create_node(int data) //创建节点 { TREE_NODE* node =new(TREE_NODE); node->data = data; node->left = NULL; node->right = NULL; } void insert(TREE_NODE* node, TREE_NODE** root) //插入一个节点到那个位置 { if(NULL == *root) { *root = node; } else { if(node->data > (*root)->data) { insert(node, & (*root)->right); } else { insert(node, &(*root)->left); } } } void PreOrderTraverse(TREE_NODE* root) //先序遍历 { if(root) { cout << root->data <<endl; PreOrderTraverse(root->left); PreOrderTraverse(root->right); } } void InOrderTraverse(TREE_NODE* root) //中序遍历 { if(root) { InOrderTraverse(root->left); cout << root->data <<endl; InOrderTraverse(root->right); } } void PostOrderTraverse(TREE_NODE * root) //后序遍历 { if(root) { PostOrderTraverse(root->left); PostOrderTraverse(root->right); cout << root->data <<endl; } } void bstree_insert(int data, BSTREE* tree) //插入一个节点 { insert(create_node(data), &tree->root); (tree->size)++; } TREE_NODE** bstree_find(int data, TREE_NODE** root) //查找DATA 对应的位置 { if(NULL==*root) { return root; } if(data >(*root)->data) { return bstree_find(data,& (*root)->right); } else if(data < (*root)->data) { return bstree_find(data, & (*root)->left); } else { return root; }//下面是非递归查找*rootif(NULL==*root){return root;}TREE_NODE* temp = *root;while(temp && ( temp->data !=data )){if(data > temp->data){temp = temp->right;}else if(data < temp->data){temp = temp->left;}if(temp){return &temp;}else{return &temp;}}} void del_node(TREE_NODE* node) //删除 该节点 { delete(node); } bool bstree_erase(int data, BSTREE* tree) //树中 插入 传入的是地址 如果想修改 这一地址变量就要 根据地址的地址 修改 { TREE_NODE** node = bstree_find(data, & tree->root); if(*node) { TREE_NODE* temp = *node;if( ((*node)->right==NULL) &&((*node)->left==NULL))//如果为叶子节点{*node = NULL;del_node(temp); --tree->size;}if(((*node)->right==NULL) &&((*node)->left!=NULL))//node的right为空{*node = (*node)->left;del_node(temp); --tree->size;}else if(((*node)->right!=NULL) &&((*node)->left==NULL))//node的left为空{*node = (*node)->right;del_node(temp); --tree->size;}//下面是左右子树都不为空 删除时任一种情况 最好用1 2 种//node的左右都不为空将left中最大的数顶替已经删除的node if(((*node)->left != NULL) && ((*node)->right != NULL)) {TREE_NODE* s = (*node)->left;while(s->right){temp=s;s=s->right;}(*node)->data = s->data;if(temp != *node){temp->righ = s->left;}else{temp->left =s->left;//类似左子树}del_node(s); --tree->size; }//node的左右都不为空将right中最小的数顶替已经删除的nodeif(((*node)->left != NULL) && ((*node)->right != NULL)) {TREE_NODE* s = (*node)->right;while(s->left){temp=s;s=s->left;}(*node)->data = s->data;if(temp != *node){temp->left = s->right;}else{temp->right =s->right;//类似右子树}del_node(s); --tree->size; }//node的左右都不为空,直接将右边整体移动到左边最大值下面if(((*node)->left != NULL) && ((*node)->right != NULL)) {TREE_NODE* s = (*node)->left;while(s->right){s=s->right;}s->right = (*node)->right;*node = (*node)->left;del_node(s); --tree->size; }//node的左右都不为空,直接将左边边整体移动到右边最小值下面if(((*node)->left != NULL) && ((*node)->right != NULL)) {TREE_NODE* s = (*node)->right;while(s->left){s=s->left;}s->left = (*node)->left;*node = (*node)->right;del_node(s); --tree->size; } return true; } return false; } void bstree_updata(BSTREE* tree,int old,int now) //新旧替换更新 { while(bstree_erase(old,tree)) { bstree_insert(now,tree); } } void clear_node(TREE_NODE** root) //清楚节点 { if(*root) { clear_node(&(*root)->left); clear_node(&(*root)->right); del_node(*root); *root = NULL; } } void clear_tree(BSTREE* tree) //clear_tree { clear_node(&tree->root); tree->size = 0; } void bstree_destroy(BSTREE* tree) //bstree_destroy { clear_tree(tree); delete(tree); } int bstree_size(BSTREE* tree) //大小 { return tree->size; } int bstree_deep(TREE_NODE* root) //深度DEPTH { if(root) { int Hleft = bstree_deep(root->left); int Hright = bstree_deep(root->right); return Hleft>Hright ? Hleft+1 : Hright+1; } return 0; } void printNodeByLevel(TREE_NODE* root) //层序遍历 { if(root ==NULL) { return; } vector<TREE_NODE*>vec; vec.push_back(root); int cur=0; int last =1; while(cur<vec.size() ) { last = vec.size(); while(cur<last) { cout<<vec[cur]->data<<" "; if(vec[cur]->left != NULL) { vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL) { vec.push_back(vec[cur]->right); } ++cur; } cout<<endl; } } void print(TREE_NODE* root) { if(root==NULL) { return; } vector<TREE_NODE*>vec; vec.push_back(root); int cur=0; while(cur<vec.size()) { cout<<vec[cur]->data<<" "; if(vec[cur]->left != NULL) { vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL) { vec.push_back(vec[cur]->right); } ++cur; } cout<<endl; } int main() { BSTREE* tree = create_tree(); bstree_insert(5, tree); bstree_insert(6, tree); bstree_insert(2, tree); bstree_insert(1, tree); bstree_insert(4, tree); bstree_insert(3, tree); cout << "the level print:\n"; printNodeByLevel(tree->root); cout << "the first print:\n"; PreOrderTraverse(tree->root); cout << "the middle print:\n"; InOrderTraverse(tree->root); cout << "the endl print:\n"; PostOrderTraverse(tree->root); cout<<"the tree deep:\n"; cout<<bstree_deep(tree->root)<<endl; bstree_erase(2,tree); cout << "delete num of 2:\n"; cout << "after delete 2 print:\n"; PreOrderTraverse(tree->root); cout << "destroy the tree:\n"; bstree_destroy(tree); return 0; }
1 0
- 链式Tree->二叉搜索树
- 二叉搜索树-链式结构实现方式
- 用链式结构实现二叉搜索树
- 使用动态分配的链式结构实现的二叉搜索树
- 链式二叉搜索树的创建及遍历
- 二叉搜索树详解链式与数组式实现
- binary search tree 二叉搜索树
- Binary Search Tree 二叉搜索树 C++
- 二叉搜索树(binary search tree)
- Binary Search Tree 二叉搜索树
- 二叉搜索树(Binary Sort Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- 二叉搜索树(Binary Search Tree)
- Binary Search Tree(二叉搜索树)
- 二叉搜索树(Binary Search Tree)
- spring的@Transactional注解详细用法
- 分油问题
- synchronized 代码块测试用例
- 题目1001:A+B for Matrices
- c++易错的地方
- 链式Tree->二叉搜索树
- fatal error: linux/compiler-gcc6.h: No such file or directory
- 图像的频域滤波-高通滤波
- apt-get相关命令
- 图片上传后预览
- bzoj 1646 bfs
- [翻译]什么是tensorflow的session
- 策略模式Java实现
- 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)