C版本的二叉树
来源:互联网 发布:7天阅卷网络 编辑:程序博客网 时间:2024/05/18 00:41
一个普通C版本的二叉树,很早以前实现的,就供新手随便看看吧!
#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;struct TreeNode{ int data; TreeNode * leftChild; TreeNode * rightChild;};void insertTreeNode( TreeNode ** node, int data ){ if( *node == NULL ) { *node = (TreeNode*)malloc( sizeof( TreeNode ) ); (*node)->leftChild = NULL; (*node)->rightChild = NULL; (*node)->data = data; return; } if( data < (*node)->data ) insertTreeNode( &(*node)->leftChild, data ); else insertTreeNode( &(*node)->rightChild, data );}void travel( TreeNode * node ){ if( node != NULL ) { travel( node->leftChild ); cout << node->data << " "; travel( node->rightChild ); }}void travelInPrev( TreeNode * node ){ if( node != NULL ) { cout << node->data << " "; travelInPrev( node->leftChild ); travelInPrev( node->rightChild ); }}TreeNode ** find( TreeNode ** root, int data ){ if( *root == NULL ) return NULL; if( (*root)->data < data ) return find( &(*root)->rightChild, data ); else if( (*root)->data > data ) return find( &(*root)->leftChild, data ); else return root;}TreeNode * findParent( TreeNode * root, TreeNode * node ){ if( root == NULL ) return NULL; if( root->leftChild->data < node->data) return findParent( root->rightChild, node ); else if( root->rightChild->data > node->data ) return findParent( root->leftChild, node ); else return root;}TreeNode * findMax( TreeNode * root ){ if( root == NULL ) return NULL; while( root->rightChild != NULL ) root = root->rightChild; return root;}void erase( TreeNode ** root, int data ){ TreeNode ** node = find( root, data ); // 若这个节点存在,则进行真正的删除操作 if( *node != NULL ) { // 若被删节点不存在左子树,则直接以右子树替代被删节点 if( (*node)->leftChild == NULL ) { TreeNode * tmp = *node; (*node) = (*node)->rightChild; free( tmp ); } else { // 找到被删节点的左子树最大节点,然后将右子树连接为最大节点的右子树即可 TreeNode * maxNode = findMax( (*node)->leftChild ); maxNode->rightChild = (*node)->rightChild; TreeNode * tmp = *node; (*node) = (*node)->leftChild; free( tmp ); } } else { cout << "The Node is not exist!!!" << endl; }}// 获取树的全部节点数目int size( TreeNode * root ){ if( root == NULL ) return 0; if( root->leftChild == NULL && root->rightChild == NULL ) return 1; int treeSize = 1; // 只要节点不为空,则其本身就该记长度为1 treeSize += size( root->leftChild ) + size( root->rightChild ); return treeSize;}// 获取树的深度int depth( TreeNode * root ){ if( root == NULL ) return 0; int leftDepth = 1 + depth( root->leftChild ); int rightDepth = 1 + depth( root->rightChild ); return ( leftDepth > rightDepth ? leftDepth : rightDepth );}// 获取叶子节点的个数int leaf( TreeNode * root ){ if( root == NULL ) return 0; if( root->leftChild == NULL && root->rightChild == NULL ) return 1; int leafSize = 0; leafSize = leaf( root->leftChild ) + leaf( root->rightChild ); return leafSize;}// 更新节点的值bool update( TreeNode ** root, int newData, int origData ){ TreeNode ** node = find( root, origData ); if( *node == NULL ) return false; erase( root, origData ); insertTreeNode( root, newData );}int main(int argc, char *argv[]){ TreeNode * root = NULL; insertTreeNode( &root, 3 ); insertTreeNode( &root, 2 ); insertTreeNode( &root, 1 ); insertTreeNode( &root, 4 ); insertTreeNode( &root, 100 ); insertTreeNode( &root, 10 ); insertTreeNode( &root, 7 ); insertTreeNode( &root, 70 ); insertTreeNode( &root, 120 ); cout << "The raw data : " << endl; travel( root ); cout << endl; cout << "The Tree Size is " << size( root ) << endl; cout << "The Tree Depth is " << depth( root ) << endl; cout << "The Tree's Leaf Size is " << leaf( root ) << endl; printf( "%d\n", (*find( &root, 100 ))->data ); cout << "After erase 4 the data : " << endl; erase( &root, 4 ); travel( root ); cout << endl; cout << "After erase 10 the data : " << endl; erase( &root, 10 ); travel( root ); cout << endl; cout << "The Root's max node : " << endl; cout << findMax( root )->data << endl; cout << "After erase 100 the data : " << endl; erase( &root, 100 ); travel( root ); cout << endl; cout << "The Tree Size is " << size( root ) << endl; cout << "The Tree Depth is " << depth( root ) << endl; cout << "The Tree's Leaf Size is " << leaf( root ) << endl; cout << "The Previous Travel is : " << endl; travelInPrev( root ); cout << endl; cout << "update 3 to 200 " << endl; update( &root, 200, 3 ); travel( root ); cout << endl; return 0;}
- C版本的二叉树
- c的二叉树
- 二叉查找树(自己写的版本)
- 计算二叉树的高度递归版本
- 二叉树的实现Java版本
- 二叉树的遍历java版本
- 二叉查找树实现(C语言版本)
- AVL平衡二叉查找树实现(C语言版本)
- 数据结构 BFS层次遍历二叉树【C语言版本】
- 二叉树/二叉搜索树的操作汇集(c++)
- 纯C创建二叉树及二叉树的遍历
- c语言二叉树和二叉搜索树的实现
- (C++)二叉树的线索化 / 线索二叉树
- c语言的二叉树的创建
- 二叉树遍历的递归与非递归版本
- 二叉搜索树的创建、遍历、插入、删除(C++版本)
- 二叉树的前序中序后序遍历 - 递归&非递归版本
- 二叉树的创建与遍历(递归版本)
- 时间复杂度的差异测评!O(n)、O(nlogn)、O(n^2)、O(n^3)以最长子段和为例
- 慌乱的表情,泄露了我的悲伤:伤感心情日志
- js实现日期比较
- javascript table 隔行变色
- 递归~逆波兰式
- C版本的二叉树
- Linux下的文本编辑器vim的使用
- mouse_event
- 程序员之路——一个老程序员对刚上大学的学弟学妹的忠告(转)
- 未找到oracle 客户端和网络组件
- Android中Cursor的作用
- 一个合格的程序员应该读过哪些书(转)
- 昨天百度的算法更新了,这真是白帽站长的福音
- T3D 数据格式