二叉树的操作
来源:互联网 发布:mac版qq不能远程协助 编辑:程序博客网 时间:2024/05/16 12:33
对于二叉树的操作,做一个简单的总结;
Tips:针对于任何树的操作,首先需要判断是不是空树
树的结构体:
int index = 0;
typedef struct BiTree{ int data; BiTree* lchild; BiTree* rchild;}*Tree;
创建树的操作:
void createBT(Tree &root,int data[]){ int value = data[index++]; if(value == -1) { root = NULL; } else { root = new BiTree; root->data = value; createBT(root->lchild,data); createBT(root->rchild,data); }}
计算结点个数:
int Count_Leaf(Tree &root){ int count = 0; if(!root) { return count; } count = Count_Leaf(root->lchild)+Count_Leaf(root->rchild)+1; return count;}
计算树中叶子结点个数
int Count(Tree &root){ if(!root) return 0; if(root->lchild == NULL && root->rchild == NULL) return 1; int numLeft = Count(root->lchild); int numRight = Count(root->rchild); return (numLeft+numRight);}
二叉树的深度:
int BT_depth(Tree &root){ if(!root) return 0; int depth_left = BT_depth(root->lchild)+1; int depth_right = BT_depth(root->rchild)+1; return depth_left>depth_right?depth_left:depth_right;}
二叉树的bfs遍历:
void Level(Tree &root){ cout << "二叉树的层次遍历" << endl; queue<BiTree*> que; if(!root) return; que.push(root); while(!que.empty()) { root = que.front(); que.pop(); cout << root->data << " "; if(root->lchild) que.push(root->lchild); if(root->rchild) que.push(root->rchild); }}
二叉树的dfs遍历:
void dfs(Tree &root){ stack<BiTree*> s; if(!root) return; s.push(root); while(!s.empty()) { root = s.top(); cout << root->data << " "; s.pop(); if(root->rchild) s.push(root->rchild); if(root->lchild) s.push(root->lchild); }}
二叉树第K层结点数:
int K_level(Tree &root,int k){ if(!root || k<1) return 0; if(k == 1) return 1; int numLeft = K_level(root->lchild,k-1); int numright = K_level(root->rchild,k-1); return (numLeft+numright);}
判断俩个二叉树是否是一样的?
bool Same_BT(Tree &root1,Tree &root2){ if(!root1 && !root2) return true; if(!root1 || !root2) return false; bool leftSame = Same_BT(root1->lchild,root2->lchild); bool rightSame = Same_BT(root1->rchild,root2->rchild); return (leftSame&&rightSame);}
二叉树的镜像:
BiTree* Mirror(Tree &root){ if(!root) return NULL; BiTree* left = Mirror(root->lchild); BiTree* right = Mirror(root->rchild); root->lchild = right; root->rchild = left; return root;}
是否是平衡二叉树:
bool isAVL(Tree &root,int &height){ if(!root) { height = 0; return true; } int heightLeft; bool left = isAVL(root->lchild,heightLeft); int heightRight; bool right = isAVL(root->rchild,heightRight); if(left && right && abs(heightLeft-heightRight)<=1) { height = max(heightLeft,heightRight)+1; return true; } else { height = max(heightLeft,heightRight)+1; return false; }}
操作的main()函数:
int main(){ int data[] = {8,6,4,-1,-1,7,-1,-1,10,9,-1,-1,11,-1,-1}; int data1[] = {8,6,4,-1,-1,7,-1,-1,10,9,-1,-1,11,-1,-1}; Tree tree; Tree tree1; createBT(tree,data); /* //int height; if(isAVL(tree,height)) { cout << "isAVL" << endl; }*/ createBT(tree1,data1); if(Same_BT(tree,tree1)) { cout<< "这俩二叉树是一样的" << endl; } else { cout << "这俩二叉树是不一样的" << endl; } //cout << "二叉树的叶子节点个数" << endl; //cout<<Count_Leaf(tree); //cout<<Count(tree)<<endl; //cout<<BT_depth(tree);*/ //Level(tree); //cout << endl; //Mirror(tree); //Level(tree); //cout<< endl; // dfs(tree); //cout<< K_level(tree,3)<<endl; return 0;}
0 0
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- 二叉树的操作
- OpenCV数据格式转换成Halcon数据格式HObject
- Java:类与继承
- Java中4大基本加密算法解析
- c#连接sql数据库并调用
- HDU 3001 Travelling
- 二叉树的操作
- 【Android】各式各样的弹出框与对菜单键、返回键的监听
- 一、网络基础
- 淘宝架构发架
- C++实现多线程安全的单例模式 已测试
- 2015.6.23 activity横竖屏切换
- Matlab与C++混合编程(依赖OpenCV)
- ios开发面试常见问题及答案
- 软件分发管理器Secure Delivery Center基本概念概述(一)