二叉树常见算法

  1 typedef struct node{
  2     int val;
  3     struct node *left, *right;
  4 }TreeNode;
  5 //求二叉树的节点个数。
  6 int GetNodeNum(TreeNode *pRoot){
  7     if(pRoot == NULL)
  8         return 0;
  9     return GetNodeNum(pRoot->left) + GetNodeNum(pRoot->right) +;
 10 }
 11 //求二叉树的深度
 12 int GetDepth(TreeNode* root){
 13     if(root == NULL)
 14         return 0;
 15     int depth_left = GetDepth(root->left);
 16     int depth_right = GetDepth(root->right);
 17     return max(depth_right, depth_left) + 1;
 18 }
 19 //三种遍历方式
 20 void PreOrderTraverse(TreeNode *root){
 21     if(root == NULL)
 22         return;
 23     visit(root->val);
 24     PreOrderTraverse(root->left);
 25     PreOrderTraverse(root->right);
 26 }
 27 void InOrderTraverse(TreeNode *root){
 28     if(root == NULL)
 29         return;
 30     InOrderTraverse(root->left);
 31     visit(root->val);
 32     InOrderTraverse(root->right);
 33 }
 34 void PostOrderTraverse(TreeNode *root){
 35     if(root == NULL)
 36         return;
 37     PostOrderTraverse(root->left);
 38     PostOrderTraverse(root->right);
 39     visit(root->val);
 40 }
 41 //层序遍历二叉树
 42 void LevelTraverse(TreeNode *root){
 43     if(root == NULL)
 44         return;
 45     queue<TreeNode*> q;
 46     q.push(root);
 47     while(!q.empty()){
 48         TreeNode *node = q.front();
 49         q.pop();
 50         visit(root->val);
 51         if(node->left != NULL)
 52             q.push(node->left);
 53         if(node->right != NULL)
 54             q.push(node->right);
 55     }
 56     return;
 57 }
 58 //求二叉树第k层的节点数
 59 int GetNodeNumKthLevel(TreeNode *root, int k){
 60     if(root == NULL || k < 1)
 61         return 0;
 62     if(k == 1)
 63         return 1;
 64     int numLeft = GetNodeNumKthLevel(root->left, k - 1);
 65     int numRight = GetNodeNumKthLevel(root->right, k - 1);
 66     return (numLeft + numRight);
 67 }
 68 //求二叉树叶子节点个数
 69 int GetLeafNodeNum(TreeNode *root){
 70     if(root == NULL)
 71         return 0;
 72     if(root->left == NULL && root->right == NULL)
 73         return 1;
 74     int numLeft = GetLeafNodeNum(root->left);
 75     int numRight = GetLeafNodeNum(root->right);
 76     return (numLeft + numRight);
 77
 78 }
 79 //判断两颗二叉树是否结构相同
 80 bool isSame(TreeNode *tree1, TreeNode *tree2){
 81     if(tree1 == NULL && tree2 == NULL)
 82         return true;
 83     if(tree1 == NULL && tree2 != NULL || tree1 != NULL && tree2 == NULL ||
 84         tree1->val != tree2->val)
 85         return false;
 86     return isSame(tree1->left, tree2->left) && isSame(tree1->right, tree2->right);
 87 }
 88 //判断二叉树是否是平衡二叉树
 89 bool IsAVL(TreeNode *root, int &height){
 90     if(root == NULL){
 91         height = 0;
 92         return true;
 93     }
 94     int heightLeft;
 95     bool resultLeft = IsAVL(root->left, heightLeft);
 96     int heightRight;
 97     bool resultRight;
 98     bool resultRight = IsAVL(root->right, heightRight);
 99     height = max(heightLeft, heightRight) + 1;
100     if(resultLeft && resultRight && (abs(heightLeft - heightRight) <= 1)){
101         return true;
102     } else {
103         return false;
104     }
105 }
106 //求二叉树的镜像
107 void mirror(TreeNode *root){
108     if(root == NULL)
109         return;
110     if(root->left == NULL && root->right == NULL)
111         return;
112     TreeNode *temp;
113     temp = root->left;
114     root->left = root->right;
115     root->right = temp;
116     mirror(root->left);
117     mirror(root->right);
118 }
119 //求二叉树中两个节点的最低公共祖先节点
120
121 //求二叉树中节点的最大距离
122 //由前序遍历和中序遍历重建二叉树
123 //判断二叉树是不是完全二叉树
124 //将二叉查找树变为有序的双向链表
时间: 2024-08-28 03:32:27

二叉树常见算法的相关文章

二叉树常见遍历算法

这几天在复习关于树的各种算法,做了一些题,也搜索了网上各种算法,现在来总结一下树的各种常见算法.本文涵盖: 二叉树先中后序遍历(递归&非递归)算法 层次遍历(正序&逆序&锯齿形)非递归算法 二叉树深度算法 结点总数算法 1.二叉树先序非递归遍历 //先序非递归遍历 public ArrayList<Integer> preorderTraversal2(TreeNode root) { Stack<TreeNode> stack = new Stack<

Binary Tree Traversal Algorithms (二叉树遍历算法)

本文共列出了11个常见的二叉树遍历算法.二叉树的遍历主要有深度优先遍历和广度优先遍历.深度优先遍历包含前序遍历.中序遍历和后序遍历. 值得一提的是, 其中的 Morris 算法 可以线性时间不需要额外空间(用户栈或系统栈空间)实现二叉树的前序遍历.中序遍历和后序遍历.关于Morris算法, 可参考 http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html 算法清单: A1. A2. A3, 分别是中序遍历的递归

Hadoop学习笔记—12.MapReduce中的常见算法

一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. (3)排序:按某个Key进行升序或降序排列 (4)TopK:对源数据中所有数据进行排序,取出前K个数据,就是TopK. 通常可以借助堆(Heap)来实现TopK问题. (5)选择:关系代数基

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

morris算法-----高级二叉树遍历算法

在遍历儿叉树时,常常使用的是递归遍历,或者是借助于栈来迭代,在遍历过程中,每个节点仅访问一次,所以这样遍历的时间复杂度为O(n),空间复杂度为O(n),并且递归的算法易于理解和实现.在遍历过程中,递归遍历过程的空间复杂度却是O(n),就算是转换为使用栈空间迭代时间,还是没有改变算法对额外空间的需求,在学习数据结构课程时,还学习了线索二叉树,在线索二叉树中,使用线索来保存节点的前驱和后继的信息,而这些线索是利用了叶节点的空指针域来保存,所以知道了树种每个节点的前驱和后继的位置(指针)可以有效降低遍

Python中的二叉树查找算法模块

问题 思路说明 二叉树查找算法,在开发实践中,会经常用到.按照惯例,对于这么一个常用的东西,Python一定会提供轮子的.是的,python就是这样,一定会让开发者省心,降低开发者的工作压力. python中的二叉树模块内容: BinaryTree:非平衡二叉树 AVLTree:平衡的AVL树 RBTree:平衡的红黑树 以上是用python写的,相面的模块是用c写的,并且可以做为Cython的包. FastBinaryTree FastAVLTree FastRBTree 特别需要说明的是:树

机器学习常见算法分类汇总

机器学习常见算法分类汇总 机器学习无疑是当前数据分析领域的一个热点内容.很多人在平时的工作中都或多或少会用到机器学习的算法.这里 IT 经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考. 机器学习的算法很多.很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的.这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性. 学习方式 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会考虑算法的学习

前端常见算法JS实现

算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1;i<arr.length;i++){ for(j=0;j<=arr.length-i;j++){ var temp = 0; if(arr[j]>arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } 2.

机器学习14种常见算法

最近收到一封公司内部邮件,说,有个机器人程序--**小助手,上线(不知道哪个部门写的),让大家没事的时候,测试,顺便让程序学习一下,超过 50 条聊天,有抽奖机会~我大概试了一下,有点无语,这写得是个神马玩意啊,这么烂,基本聊不上 3 句,最多也就是,"你是谁","多大了",即便我顺着程序说,也是驴唇不对马嘴~你要是让程序学习,互联网这么大,还用得着让人来吗,即便让人来,自己也得差不多才行啊,连个雏形都没有,还好意思让大家测试,美其名曰:让程序学习~ 机器学习无疑是