zoukankan      html  css  js  c++  java
  • 二叉树的常用操作

    /*
    二叉树
    1、创建二叉树
    2、先序遍历
    3、中序遍历
    4、后序遍历
    5、二叉树的深度
    6、二叉树的镜像
    */
    #include "stdafx.h"
    #include <iostream>
    #include <queue>
    #include <stdio.h>
    using namespace std;
    typedef struct BiNode  //声明二叉树
    {
    	char data;
    	struct BiNode *lchild, *rchild;
    }*BiTree,BiNode;
    //按先序序列建立二叉树的二叉链表
    BiTree CreateBiTree(BiTree &T) {  //引用传参(如果是指针就会报错)
    	char ch;
    	cin >> ch;
    	if (ch=='#') {
    		T = NULL;
    	}
    	else {
    		T = (BiTree )malloc(sizeof(BiNode));//申请动态内存
    		T->data = ch;
    		CreateBiTree(T->lchild);  //创建左子树
    		CreateBiTree(T->rchild);  //创建右子树
    	}
    	return T;   //返回的根节点
    }
    //先序遍历
    void PreOrder(BiTree T)
    {
    	if (T == NULL)
    		return;
    		cout << T->data <<" ";
    	if(T->lchild!=NULL)
    		PreOrder(T->lchild);
    	if(T->rchild!=NULL)
    		PreOrder(T->rchild);
    }
    //中序遍历
    void MidOrder(BiTree T)
    {
    	if (T == NULL)
    		return ;
    	if (T->lchild != NULL)
    		MidOrder(T->lchild);
    	cout << T->data << " ";
    	if (T->rchild)
    		MidOrder(T->rchild);
    }
    //后序遍历
    void PostOrder(BiTree T)
    {
    	if (T == NULL)
    		return;
    	if (T->lchild)
    		PostOrder(T->lchild);
    	if (T->rchild)
    		PostOrder(T->rchild);
    	cout << T->data <<" ";
    }
    //二叉树的深度
    int TreeDepth(BiTree T)
    {
    	if (T == NULL)//如果根节点为空
    		return 0;
    	//如果T!=NULL至少深度为1
    	int left = 1;
    	int right = 1;
    	left += TreeDepth(T->lchild);//求左子树的深度
    	right += TreeDepth(T->rchild);//求右子树的深度
    	return left > right ? left : right;
    }
    //二叉树的宽度(有一定难度)
    
    
    //二叉树的镜像
    void MirrorTree(BiTree T)
    {
    	if (T == NULL)  //根节点为空
    		return ;
    	if ((T->lchild == NULL) && (T->rchild == NULL))  //左右孩子都不为空(必须保证左右节点存在时交换左右孩子的指针)
    		return;
    	//交换根节点左右节点的的指针
    	BiNode *temp = T->lchild;
    	T->lchild = T->rchild;
    	T->rchild = temp;
    	if (T->lchild)
    		MirrorTree(T->lchild);
    	if (T->rchild)
    		MirrorTree(T->rchild);
    }
    
    int main()
    {
    	BiTree root=NULL;  
    	root=CreateBiTree(root);//返回根节点的地址
    	cout <<"先序遍历" << endl;
    	PreOrder(root);
    	cout <<endl<<"中序遍历"<<endl;
    	MidOrder(root);
    	cout <<endl<<"后序遍历" << endl;
    	PostOrder(root);
    	cout << endl;
    	int treeDepth = TreeDepth(root);
    	cout << "树的深度是:"<<treeDepth<<endl;
    	MirrorTree(root);//二叉树的镜像
    	PreOrder(root);//先序遍历
        return 0;
    }
    

      

  • 相关阅读:
    微软收购以色列触控笔技术
    西少爷肉夹馍:我们依然是一家互联网公司
    刘强东哈佛演讲:留学生应回国 不要辜负时代
    与海外买家沟通技巧20招,总有一招适合您
    转:腾讯福利升级 今起员工购首套房可无息贷款最高50万元
    Action Required: Listings Deactivated for Potential Pricing Error
    转:为什么说招到合适的人比融到钱更加重要
    华为离职副总裁徐家骏:年薪千万的工作感悟
    how to update product listing price sale price and sale date using mobile App
    二零一五年正月初四
  • 原文地址:https://www.cnblogs.com/dingou/p/5940302.html
Copyright © 2011-2022 走看看