`
smallearth
  • 浏览: 37483 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

C++ 二叉树(创建,遍历,查找,插入,删除)『菜鸟版』

 
阅读更多
//二叉树操作

#include "stdafx.h"
#include<iostream>
using namespace std; 
int num_visit=0;//记录输出元素个数
struct tnode{   
    public: int data;
    public: tnode *left,*right;
	
    tnode(){}
	tnode(int item,tnode *p,tnode *q):data(item),left(p),right(q){}
 };
typedef tnode *Tnode;
//生明函数
int menu();//菜单
void main_menu(Tnode root,int n);//主菜单
Tnode createTree();//创建二叉树
int visit(int t);//访问节点
void showTree(Tnode , int );//遍历
int level_showTree(Tnode root);//先序便遍历二叉树
int inorder_showTree(Tnode root);//中序遍历二叉树
int postorder_showTree(Tnode root);//后序遍历二叉树
bool search(Tnode root,int search_num);//查找二叉树
Tnode insert(Tnode root,int insert_num);//插入
void d_delete(Tnode,int);//删除
void free(Tnode root);//free
//主函数
void main()
{
	Tnode root = createTree();	
	//菜单
	int n = menu();
	//退出
	if(n ==0 ){
	  return;
	}
	//遍历
	if(n<=3)
	{
	  showTree(root,n);
      main_menu(root,n);
	}
	//查找
	 if(n == 4){
	     cout<<"请输入要查找的结点的元素值:";
		 cin>>n;
		 search(root,n);
		 main_menu(root,n);
	  }
	//插入
    if(n == 5){
	    cout<<"请输入要插入的节点的元素值:";
		cin>>n;
		insert(root,n);
		main_menu(root,n);
	  }
	//删除
	if(n == 6){
	   cout<<"请输入要删除的结点元素值:";
	   cin>>n;
	   d_delete(root,n);
	   n = menu();
	   main_menu(root,n);
	}
}
//菜单
int menu(){
	  cout<<"        菜单:输入0退出."<<endl<<endl;
	  cout<<"一 遍历:"<<endl;
	  cout<<"1.先序遍历 请输入1.";
	  cout<<endl<<"2.中序遍历 请输入2.";
	  cout<<endl<<"3.后序遍历 请输入3.";
	  cout<<endl<<endl<<"二 查找:"<<endl;
	  cout<<"4.查找 请输入4."<<endl;
	  cout<<endl<<"三 插入:"<<endl;
	  cout<<"5.插入 请输入5."<<endl;
	  cout<<endl<<"四 删除:"<<endl;
	  cout<<"6.删除 请输入6."<<endl<<endl;
	  cout<<"请输入:";
	  int n;
	  cin>>n;
	  return n;
}
//主菜单
void main_menu(Tnode root,int n){
	while(n>=0){
		n = menu();

		if(n==0){
		return;
		}
		if(n<=3)
		{
		  showTree(root,n);
		}
		//查找
		 if(n == 4){
			 cout<<"请输入要查找的结点的元素值:";
			 cin>>n;
			 cout<<search(root,n);
		  }
		//插入
		if(n == 5){
			cout<<"请输入要插入的节点的元素值:";
			cin>>n;
			insert(root,n);
		  }
		if(n == 6){
		   cout<<"请输入要删除的结点元素值:";
		   cin>>n;
		   d_delete(root,n);
		}
	}
}
//创建二叉树
Tnode createTree(){
   Tnode root,p,q;
   
   //左子树
   p = new tnode(96,NULL,NULL);
   //右子树
   q = new tnode(104,NULL,NULL);
   //根节点
   root = new tnode(100,p,q);
   return root;
}
//访问节点
int visit(int t){
	   cout<<t<<" ";
	   if(++num_visit%5 == 0)
		   cout<<endl;
	 return 1;
}
//遍历
void showTree(Tnode root,int n){
  
  switch(n){
      case 1: 
		   cout<<"先序遍历:"<<endl;
		   level_showTree(root);
	    break;
	  case 2: 
		  cout<<"中序遍历:"<<endl;
		  inorder_showTree(root);
		break;
	  case 3:
		  cout<<"后序遍历:"<<endl;
		  postorder_showTree(root);
		break;
	  default:
		  return; 
  }
  cout<<endl;
}
//先序遍历二叉树
int level_showTree(Tnode root){
	if(root){
	    visit(root->data);
		level_showTree(root->left);
		level_showTree(root->right);
	}else
		return 0;
}
//中序遍历
int inorder_showTree(Tnode root){
	if(root){
		inorder_showTree(root->left);
		visit(root->data);
		inorder_showTree(root->right);
	}else
		return 0;
}
//后序遍历
int postorder_showTree(Tnode root){
	if(root){
		postorder_showTree(root->left);
		postorder_showTree(root->right);
		visit(root->data);
	}else 
		return 0;
}
//查找
bool search(Tnode root,int search_num){
	if(root){
	   if(root->data == search_num){
			cout<<root->data <<"=="<< search_num<<endl;
		    return true;
	   }else{
		   search(root->left,search_num);
		   search(root->right,search_num);
		 }  
	}else{
		return false;
	}
}
//插入
Tnode insert(Tnode root,int insert_num){
	if(search(root,insert_num)){
    	cout<<"此节点存在!"<<endl;
		return NULL;
	}else
		if(root == NULL){
			root = new tnode(insert_num,NULL,NULL);
		}else{
		  if(root->data>insert_num){
			  root->left = insert(root->left,insert_num);	
		  }else{
			  root->right = insert(root->right,insert_num);
		  }
		}
		return root;
}
//删除
void d_delete(Tnode root,int d_num){
	if(root){
		if(root->left->data == d_num){
			root->left = NULL;
			free(root->left);
		}else if(root->right->data == d_num){
			root->right = NULL;
			free(root->right);
		}else{
			d_delete(root->left,d_num);
			d_delete(root->right,d_num);
		}
	}else
		return;
}
//free
void free(Tnode root){
	if(root){
		free(root->left);
		free(root->right);
		delete root;
	}
}

分享到:
评论

相关推荐

    二叉树深度遍历广度遍历

    - 二叉树的其他基本操作包括插入节点、删除节点、查找节点、判断树是否平衡等。 - 遍历方法也可以进行修改,如层次遍历中的层序遍历,以及对树的镜像遍历。 总之,掌握二叉树的深度遍历和广度遍历是理解和应用...

    c++使用二叉树进行查找 插入 删除

    c++使用二叉树进行查找 插入 删除 #include "stdafx.h" #include&lt;iostream&gt; using namespace std; int num_visit=0;//记录输出元素个数 struct tnode{ public: int data; public: tnode *left,*right; ...

    软件工程课程设计 二叉树的遍历

    - 实现二叉树的基本操作,如插入、删除、查找等。 - 实现二叉树的遍历操作,包括前序遍历、中序遍历、后序遍历以及层次遍历。 - 设计合理的数据结构存储二叉树的节点信息。 - 提供足够的测试案例验证程序的正确性和...

    二叉树_C++_二叉树遍历_Vc_

    在`二叉树.cpp`文件中,可能包含了二叉树的基本操作实现,如创建节点、插入节点、删除节点以及进行各种遍历的方法。而在`二叉排序树.cpp`文件中,可能会有针对二叉排序树特性的函数,如查找特定值、维持树的平衡...

    C++实现异质二叉树的查找、插入、删除和遍历操作

    二叉树的常见操作包括查找、插入和删除。在异质二叉树中,这些操作的实现会因为节点可能包含不同类型的值而变得复杂。 2. **C++的面向对象编程**: 在C++中,我们通常通过定义类来表示二叉树的节点。为了实现异质...

    C语言实现二叉树的前序遍历(非递归)

    在计算机科学中,二叉树被广泛应用于搜索算法、排序算法以及数据压缩等场景,因其在查找、插入和删除操作上具有较高的效率。 ### 前序遍历 前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -&gt; 左子树 -&gt; 右子树...

    二叉树建立与遍历(c++描述)

    二叉查找树提供了快速的查找、插入和删除操作,其性能与树的高度有关。 总的来说,理解和掌握二叉树的建立与遍历是学习数据结构和算法的重要一环,特别是在C++这样的编程语言中,这些概念对于开发高效且优化的软件...

    C程序:二叉树的遍历

    通过运行和调试这个C程序,学生可以亲手实践二叉树遍历的过程,从而加深理解。此外,Visual C++ 6.0是一个经典的开发环境,虽然有些过时,但它仍然是学习C/C++的良好工具,其集成的调试器可以帮助学生逐步跟踪代码...

    二叉树的层次遍历 vc++控制台程序

    1. **二叉树基本操作类**:这个类通常包含创建、插入、删除、查找等基本操作。例如,一个简单的二叉树节点可能包含一个值、指向左子节点和右子节点的指针。在C++中,可以定义一个名为`BinaryTreeNode`的结构体或类来...

    数据结构实验 二叉树遍历与路径查找

    本实验“数据结构实验:二叉树遍历与路径查找”着重探讨了如何用C/C++语言实现二叉树的遍历和路径查找功能。 首先,我们来理解二叉树的基本概念。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常...

    二叉树建立遍历

    在实际应用中,二叉树遍历算法不仅限于简单的打印节点值,还可以用于查找、插入、删除等操作。例如,在二叉搜索树中,中序遍历可以快速找到一个特定的元素;而在构建表达式树时,后序遍历可以帮助我们求解表达式的值...

    基于C++实现二叉树的创建,遍历,添加,查找与删除

    本篇文章将详细探讨如何使用C++来创建、遍历、添加、查找和删除二叉树节点。 首先,我们需要定义一个二叉树节点的结构体。这个结构体通常包含两个指针,分别指向左子节点和右子节点,以及一个存储节点值的数据成员...

    二叉树的基本操作,前序遍历,中序遍历,后序遍历,层序遍历

    二叉树的基本操作主要包括创建、插入、删除节点以及遍历等。创建二叉树时,需要指定根节点,之后通过插入操作来构造完整的二叉树结构。删除节点时要考虑节点是否有子节点,以及如何调整树的结构以保持二叉树的特性。...

    二叉树的各种遍历,二叉搜索树的建立,前中序构建二叉树

    这种特性使得搜索、插入和删除操作的时间复杂度可以达到O(log n)。二叉搜索树的构建通常是从根节点开始,根据输入数据动态构建的。 **前序序列和中序序列构建二叉树**:给定一个二叉树的前序和中序遍历序列,可以...

    数据结构 二叉树的遍历

    总之,二叉树遍历是数据结构与算法中的基础操作,理解和掌握各种遍历方法对于解决计算机科学中的许多问题至关重要。通过对二叉树的前序、中序、后序以及层序遍历的理解和实践,我们可以更好地处理树形数据结构,提高...

    二叉树插入删除遍历,满足您各种需求

    本主题聚焦于“二叉树插入删除遍历”,主要介绍C++中如何使用模板类来实现二叉树的基本操作。 首先,让我们深入理解二叉树的概念。二叉树是由节点(或称为结点)组成的非线性数据结构,每个节点最多有两个子节点,...

    二叉树遍历(VC++源程序)

    例如,二叉搜索树的查找、插入和删除操作,以及图的最短路径计算等,都会用到二叉树的遍历方法。VC++作为一款强大的C++集成开发环境,能够方便地实现这些算法,为开发者提供了便利。通过理解并掌握以上遍历方法,...

    二叉树创建及其基本操作C++.zip

    本资源包“二叉树创建及其基本操作C++.zip”提供了关于二叉树创建和基本操作的实例,包括节点的增加、删除、查找和修改,以及线索二叉树的概念。下面将详细阐述这些知识点。 二叉树是一种非线性数据结构,每个节点...

    C++实现二叉树功能的插入删除等等基本操作

    在本文中,我们将深入探讨如何使用C++实现二叉树的基本操作,包括插入、删除等。二叉树是一种数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。它在计算机科学中有着广泛的应用,如搜索、排序、...

Global site tag (gtag.js) - Google Analytics