二叉树的常用操作
/*
二叉樹
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至少深度為1int 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;
}
轉載于:https://www.cnblogs.com/dingou/p/5940302.html
總結
- 上一篇: ASP.NET Core官方计划路线及需
- 下一篇: [SQL] SQL 基础知识梳理(三)