查找二叉树
来源:互联网 发布:js a href click 编辑:程序博客网 时间:2024/06/06 01:34
/* *典型的二叉树,此二叉树的构建方法是: *第一个输入的数字为根结点 *下一个数字若比第一个数字小则为其左孩子,比第一个数字大则为其右孩子 * *所以使用中序遍历能够将树中的数字按从小到大的顺序排列。 *三种遍历方法针对不同的树的构造方法 * *代码中包含以下功能模块: * 1.向二叉树中插入元素 * 2.先序遍历二叉树 * 3.中序遍历二叉树 * 4.后序遍历二叉树 * 5.查询二叉树 * 6.获取树中最大元素和最小元素 * 7.获取某个数字的前驱和后继 * 8.删除二叉树中的某个元素 * Author: StoryMonster *Last change Date: 2016/6/22 */#include <iostream>#include <stdlib.h>typedef struct aa{ struct aa * left; struct aa * right; struct aa * father; int value;} TreeNode;TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));int NodeCount = 0;/* *在以node为根结点的树中查找值为value的节点 *返回该节点,若无该节点返回NULL */TreeNode *Search(TreeNode *node,int value){ if(node->value == value || node == NULL) { return node; } if(node->value < value) { Search(node->right,value); } else { Search(node->left,value); }}/* *获取以node为根结点的树中值最大的节点 */TreeNode *Maximum(TreeNode *node){ if(node->right == NULL) { return node; } Maximum(node->right);}/* *获取以node为根结点的树中值最小的节点 */TreeNode *Minimum(TreeNode *node){ if(node->left == NULL) { return node; } Minimum(node->left);}/* *获取node节点在中序遍历下的后继节点 */TreeNode *Successor(TreeNode *node){ if(node->right != NULL) { return Minimum(node->right); } TreeNode *p = node->father; while(p != NULL && node == p->right) { node = p; p = node->father; } return p;}/* *获取node节点在中序遍历下的前驱节点 */TreeNode *Precursor(TreeNode *node){ if(node->left != NULL) { return Maximum(node->left); } TreeNode *p = node->father; while(p->left == node && p!=NULL) { node = p; p = node->father; } return p;}/* *删除树中一个节点 */void DeleteNode(TreeNode *node){ if(node->left == NULL&&node->right == NULL) { TreeNode *p = node->father; if(p->left == node) { p->left = NULL; } else { p->right = NULL; } free(node); NodeCount--; } else if(node->left == NULL) { TreeNode *child = node->right; TreeNode *p = node->father; if(p->left == node) { p->left = child; } else { p->right = child; } free(node); NodeCount--; } else if(node->right == NULL) { TreeNode *child = node->left; TreeNode *p = node->father; if(p->left == node) { p->left = child; } else { p->right = child; } free(node); NodeCount--; } else { TreeNode *p = Successor(node); DeleteNode(p); node->value = p->value; }}/* *插入元素的递归 */void InsertNode(TreeNode *node,TreeNode *p){ if(p->left == NULL && (p->value >= node->value)) { p->left = node; node->father = p; return ; } if(p->right == NULL && (p->value < node->value)) { p->right = node; node->father = p; return; } if(p->value >= node->value) { InsertNode(node,p->left); } else { InsertNode(node,p->right); }}/* *插入节点 */void Insert(TreeNode *node){ if(root == NULL) { root = node; NodeCount++; return ; } TreeNode *p = root; InsertNode(node,p); NodeCount++;}/* *先序遍历递归体 */void preorderTraversal(TreeNode *p){ if(p == NULL) { return ; } std::cout << p->value << " "; preorderTraversal(p->left); preorderTraversal(p->right);}/* *先序遍历 */void PreorderTraversal(){ TreeNode *p = root; preorderTraversal(root); std::cout << std::endl;}/* *中序遍历递归体 */void inorderTraversal(TreeNode *p){ if(p == NULL) { return ; } inorderTraversal(p->left); std::cout << p->value << " "; inorderTraversal(p->right);}/* *中序遍历 */void InorderTraversal(){ TreeNode *p = root; inorderTraversal(p); std::cout << std::endl;}void postorderTraversal(TreeNode *p){ if(p == NULL) { return ; } postorderTraversal(p->left); postorderTraversal(p->right); std::cout << p->value << " ";}/* *后序遍历 */void PostorderTraversal(){ TreeNode *p = root; postorderTraversal(p); std::cout << std::endl;}int main(){ root = NULL; short choice = 0; int value = 0; while(1) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); std::cout << "1:insert 2:preorder tranversal 3:inorder tranversal 4:postorder tranversal 5:delete node" << std::endl; std::cin >> choice; switch(choice) { case 1: std::cout << "input value:"; std::cin >>node->value; node->father = NULL; node->left = NULL; node->right = NULL; Insert(node); std::cout << "there are " << NodeCount << " nodes in this tree!"<< std::endl; break; case 2: std::cout << "preorder traversal:"; PreorderTraversal(); break; case 3: std::cout << "inorder traversal:"; InorderTraversal(); break; case 4: std::cout << "postorder traversal:"; PostorderTraversal(); break; case 5: std::cout << "input node value:"; std::cin >> value; TreeNode *p = Search(root,value); DeleteNode(p); std::cout << "there are " << NodeCount << " nodes left!"<< std::endl; break; } } return 0;}
0 0
- 查找--二叉查找树
- 二叉树、二叉查找树
- 二叉树 & 二叉查找树
- 【查找结构】二叉查找树
- 查找之二叉树查找
- 查找之二叉树查找
- 查找:二叉查找树总结
- 二叉树查找树...
- 二叉树查找树
- 查找--遍历二叉树
- 二叉查找树
- 二叉查找树实现
- 二叉查找树
- 动态二叉查找树
- 最优二叉查找树
- 二叉查找树
- 二叉查找树
- 平衡二叉查找树
- CSS盒子模型(续一)
- Java NIO系列教程(四) Scatter/Gather
- 俚语、口语及常见用法的理解
- Software Testing-How To Design Test Case
- Linux的环境变量.bash_profile .bashrc profile文件
- 查找二叉树
- stm32寄存器地址名称映射
- Hadoop2.4.1 简单的用户手机流量统计的MapReduce程序(二)
- Linux 下环境变量配置文件
- 占位
- 单向链表
- [Leetcode]19. Remove Nth Node From End of List
- ESRI官网关于Javascript的内容(3)__将3.x升级到4.0
- IOS Dev Intro - Create UImage from Sample Buffer Data