二叉树总结一

二叉树的知识点1:

二叉树存储结构

前序建立二叉树

前序遍历、中序遍历、后序遍历(递归、非递归)

二叉树节点总数

二叉树叶子节点数

二叉树深度

遍历二叉树第i层节点

分层遍历二叉树(递归、非递归)

求二叉树中节点的最大距离

已知前序、中序,重建二叉树:

 

以下为具体程序,在devc++中验证正确: 

/*

abd##e##c##

前序:a b d e c

中序:d b e a c

后序:d e b c a

*/

 

#include<stdio.h>

#include<stdlib.h>

#include<stack>

#include<vector>

 

using namespace std;

 

struct node{

       char value;

       struct node * left;

       struct node * right;

};

 

typedef struct node Node;

 

int max_dis=0;

 

//建树

Node* create_tree(){

     Node * root = NULL;

     char input;

     scanf("%c",&input);

     if(input == '#'){

          return NULL;              

     }else{

          root = (Node *)malloc(sizeof(Node));

          if(NULL == root){

                  printf("memory allocation wrong");

                  return NULL;

          }

          root->value = input;

          root->left = create_tree();

          root->right = create_tree();

     }

     return root;

}

 

//递归前序遍历

void qianxu_travel(Node * root){

     if(NULL == root){

             return;

     }

     printf("%c ",root->value);

     qianxu_travel(root->left);

     qianxu_travel(root->right);

}

 

//递归中序遍历

void zhongxu_travel(Node * root){

     if(NULL == root){

             return;

     }

     zhongxu_travel(root->left);

     printf("%c ",root->value);

     zhongxu_travel(root->right);

}

 

//递归后序遍历

void houxu_travel(Node * root){

     if(NULL == root){

             return;

     }

     houxu_travel(root->left);

     houxu_travel(root->right);

     printf("%c ",root->value);           

}

 

//前序遍历非递归

void qianxu_no_rec(Node* root){

     stack<Node*> s;

     while(NULL != root || !s.empty()){

         if(NULL != root){

             printf("%c ",root->value);

             s.push(root);

             root = root->left;

         }else{

             root = s.top();

             s.pop();

             root = root->right;

         }        

     }

}

 

//中序遍历非递归

void zhongxu_norec(Node* root){

     stack<Node*> s;

     while(NULL !=root || !s.empty()){

          if(NULL != root){

               s.push(root);

               root = root->left;

          }else{

               root = s.top();

               s.pop();

               printf("%c ",root->value);

               root = root->right;

          }                   

     }  

}

 

//递归遍历第i层节点

int level_i_travle(Node* root, int level){

     if(NULL == root || level < 0){

             return 0;

     } 

     if(level == 1){

              printf("%c ",root->value);

     }

     return level_i_travle(root->left,level-1)+level_i_travle(root->right,level-1);

}

 

//非递归分层遍历二叉树

void level_norec(Node* root){

     if(NULL == root){

             return;

     }

     vector<Node*> v;

     v.push_back(root);

     int cur = 0, last = 0;

     while(cur < v.size()){   //使用游标,不出队列

           last = v.size();

           while(cur < last){

                     printf("%c ",v[cur]->value);

                     if(v[cur]->left){

                            v.push_back(v[cur]->left);

                     }

                     if(v[cur]->right){

                            v.push_back(v[cur]->right);

                     }

                     cur ++;

           }      

           printf("\n");

     }

}

 

//求叶子节点的个数

int leaf_num(Node* root){

    if(NULL == root){

            return 0;

    }

    if(NULL == root->left && NULL == root->right){

            return 1;

    }

    return leaf_num(root->left) + leaf_num(root->right);

}

 

//求二叉树的节点个数

int node_num(Node* root){

    if(NULL == root){

            return 0;

    }

    return 1+node_num(root->left)+node_num(root->right);  

}

 

//求二叉树的高度

int height(Node* root){

    if(NULL == root){

            return 0;

    }

    int num1 =  height(root->left);

    int num2 =  height(root->right);

    if(num1 >= num2){

            return 1+num1;

    }else{

          return 1+num2;

    }

}

 

//求二叉树中节点的最大距离

int max_distance(Node* root){

    if(NULL == root){

            return 0;

    }

    int num1 = max_distance(root->left);

    int num2 = max_distance(root->right);

    if(max_dis < (1+num1+num2)){

           max_dis = 1+num1+num2;

    }

    if(num1 >= num2){

            return 1+num1;

    }else{

          return 1+num2;

    }

}

 

//根据前序、中序,重建二叉树

void rebuild(char* preOrder, char* inOrder, int treeLen, Node** root){

     //边界判断

     if(NULL == preOrder || NULL == inOrder){

             return;

     }

     Node* p = (Node*)malloc(sizeof(Node));  //根节点赋值

     p->value = preOrder[0];

     p->left = NULL;

     p->right = NULL;

 

     if(NULL == *root){

             *root = p;

     }

    

     if(treeLen == 1){    //剪枝

                return;

     }

    

     int left_len = 0;

     int right_len = 0;

     int tmp_len = 0;

     char* left_inOrder = inOrder;  //求左子树的长度

     while(*left_inOrder != *preOrder){

          if(NULL == left_inOrder || NULL == preOrder){

                  return;

          }         

          tmp_len ++;

          if(tmp_len > treeLen){

                  break;

          }

          left_inOrder++;

     }

 

     left_len = left_inOrder - inOrder;

     right_len = treeLen - 1 - left_len;

    

     if(left_len > 0){

                 rebuild(preOrder+1,inOrder,left_len,&((*root)->left));  //递归建造左子树

     }

 

     if(treeLen-left_len+1 > 0){

                  rebuild(preOrder+left_len+1,inOrder+left_len+1,right_len,&((*root)->right));  //递归建造右子树

     }

}

  

int main(){

   

    Node * root = NULL;

    char* szPreOrder = "abdcef";

    char* szInOrder = "dbaecf";

    

    //传指针的指针,用于后续打印

   /* rebuild1(szPreOrder, szInOrder, 6, &root);

   

    printf("前序递归遍历序列:\n");

    qianxu_travel(root);

    printf("\n");

   */

   

    printf("输入以建立二叉树:\n");

    root = create_tree();

   

    printf("非递归分层遍历二叉树:\n");

    level_norec(root);

   

    int k = 3;

    printf("第%d层节点:\n",k);

    level_i_travle(root,k);

    printf("\n");

   

    printf("叶子节点个数:%d\n",leaf_num(root));

   

    printf("节点个数:%d\n",node_num(root));

   

    printf("高度:%d\n",height(root));

   

    printf("前序递归遍历序列:\n");

    qianxu_travel(root);

    printf("\n");

   

    printf("前序非递归遍历序列:\n");

    qianxu_no_rec(root);

    printf("\n");

   

    printf("中序遍历序列:\n");

    zhongxu_travel(root);

    printf("\n");

   

    printf("中序非递归遍历序列:\n");

    zhongxu_norec(root);

    printf("\n");

   

    printf("后序遍历序列:\n");

    houxu_travel(root);

    printf("\n");

   

    printf("后序非递归遍历序列:\n");

   // houxu_norec(root);

   

    printf("节点之间的最大距离:\n");

    max_distance(root);

    printf("%d\n",max_dis);

   

    destory_tree(root);

   

    system("pause");

    return main();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Ubuntu 16.04 远程桌面

转自&#xff1a;实现Windows直接远程访问Ubuntu 18.04&#xff08;旧版本也支持,无需安装第三方桌面,直接使用自带远程工具&#xff09; - 法号阿兴 - 博客园 一、设置Ubuntu 16.04 允许进行远程控制 首先&#xff0c;我们先设置Ubuntu的远程控制&#xff0c;将其设置为允许被…

GridView应用整理

2009年5月31日下午 21:58:38 获取GridView中RowCommand的当前选中行索引 <asp:GridView ID"BookGridView" runat"server"><Columns><asp:BoundField DataField"id" HeaderText"图书编号" /><asp:BoundField Data…

【转】VNC不同软件之间的联系与区别

转自&#xff1a;http://www.52iot.net/book/net/76.mhtml 如果不是经常远程不建议使用VNC&#xff0c;毕竟比较耗资源 不建议使用vnc&#xff0c; 如果只是使用文件服务&#xff0c;可以通过ssh协议的客户端访问过去操作。 现在gnome&#xff0c;kde, unity都是内置的&#x…

二叉树总结二

二叉树基本知识点2&#xff1a; 二叉树的非递归后序遍历 前序遍历是&#xff1a;根、左、右&#xff0c;后序遍历是&#xff1a;左、右、根&#xff0c;观察发现&#xff1a;前序和后序刚好遍历顺序相反。由于非递归后序遍历需要保存根节点及第几次访问&#xff0c;比较麻烦。可…

【转】Ubuntu下使用sysv-rc-conf管理服务

转自&#xff1a;https://www.linuxidc.com/Linux/2016-11/136834.htm sysv-rc-conf简介 sysv-rc-conf是一个强大的服务管理程序&#xff0c;群众的意见是sysv-rc-conf比chkconfig、rcconf好用。 背景知识 Ubuntu运行级别 Linux 系统任何时候都运行在一个指定的运行级上&…

几个常用SQL2000语句

排名语句select *,(select count(1) 1 from tPlanApply where applyquantity> a.applyquantity ) as 名次 from tPlanApply a order by 名次 替换语句 SQL code update tbset 字段replace(字段,替换后字符串,替换前字符串) 转载于:https://www.cnblogs.com/delphix/archiv…

WINCE6.0支持Multiple XIP

1. Multiple XIP support XIP(eXecute-In-Place)是本地执行&#xff0c;允许在ROM芯片内执行XIP区域(region)的应用代码&#xff0c;而不必再把代码读取到RAM中来执行。WINCE支持我们在单个系统中构建(construct)多个XIP区域&#xff0c;基于下面的理由使用多个XIP区域来代替…

【转】How to install VNC server on ubuntu 14.04

转自&#xff1a;https://www.krizna.com/ubuntu/install-vnc-server-ubuntu-14-04/ VNC server is used to share graphical desktop which can be controlled from other computers . This guide is helpful to install VNC server on Ubuntu Desktop 14.04, Ubuntu server …

Nsis 使用1-- 依条件显示自定义页面 custom page on condition

在制作安装程序的时候&#xff0c;我们会经常遇到根据用户的不同选择而随后显示不同的安装信息采集页面。 其实很简单&#xff0c;在使用NSIS的时候发现了这么个方法&#xff0c;记下来防止自己忘记哈&#xff1a;Code; MUI 2 compatible ------!include "MUI2.nsh"!…

WINCE6.0操作系统---内核(kernel)学习

备注&#xff1a;这里的内核指kernel&#xff0c;其表现形式为kernel.dll&#xff0c;OS指操作系统&#xff0c;core指核心。 图1 WINCE6.0体系结构 1. kernel的组成和功能 WINCE6.0操作系统内(kernel)在代码中的表现形式是kernel.dll(也就是kern.dll)&#xff0c; WINCE5…

【转】WPF调用图片路径,或资源图片

转自&#xff1a;https://www.cnblogs.com/sntetwt/p/5402098.html 一、加载本项目的图片 WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源。 其中较为常见的情况是用Uri加载图像。Uri表达式的一般形式为&#xff1a;协议授权路径 协议&#xff1a;pa…

如何自学java迅速成为java高手

很多网友咨询学习Java有没有什么捷径,我说“无他&#xff0c;唯手熟尔”。但是JAVA私塾愿意将一些经验写出来&#xff0c;以便后来者少走弯路,帮助别人是最大的快乐嘛&#xff01; 要想学好Java&#xff0c;首先要知道Java的大致分类。我们知道&#xff0c;自从Sun推出Java以来…

WINCE6.0体系结构学习

WINCE6.0的体系结构图如下图所示&#xff1a; 图1 WINCE的体系结构 根据上图可以把WINCE6.0体系结构分为硬件层、OEM层、操作系统层和应用层&#xff0c;这四层紧密合作&#xff0c;相互配合来完成从应用程序的调用到对硬件的操作和交互。 1. 硬件层 硬件平台的核心是嵌入…

【转】DICOM图像像素值(灰度值)转换为CT值

转自&#xff1a;https://www.cnblogs.com/xuhui24/p/6193032.html https://zhuanlan.zhihu.com/p/358770379 CT值的单位是Hounsfield&#xff0c;简称为Hu&#xff0c;范围是-1024-3071。用于衡量人体组织对X射线的吸收率&#xff0c;设定水的吸收率为0Hu。 在DICO…

无限级分类查询

关于无限级分类的查询问题 分类表cataid parentid1 02 13 14 25 2 表 table1 id cataid title 一个分类信息表&#xff0c;根类别是parentid为0的 这时要查询出类别1下面的所有内容&#xff0c;怎么查&#xff0c;&#xff1f;转载于:https://www…

C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别

一般我们进行成员变量初始化用两种方法 第一种是通过在构造函数内赋值 class Point{public:Point(){ _x 0; _y 0;};Point( int x, int y ){ _x 0; _y 0; }private:int _x, _y;}; 第二种是使用初始化列表 class Point{public:Point():_x(0),_y(0){};Point( int x, int y ):_…

【转】深度理解C# 的执行原理

转自&#xff1a;https://zhuanlan.zhihu.com/p/47177008 从编译原理说起虚拟机是什么C# 是什么&#xff0c;IL 又是什么.Net Framework vs MonoUnity3D 中的 C#小结作者&#xff1a;易立 | 腾讯IEG高级工程师为什么 Unity3D 可以运行 C#&#xff0c;C# 和 Mono 是什么关系&am…

C#提供的类库能够轻松实现对文件的操作

//C#写入/读出文本文件 stringfileName "c:I.txt";   StreamReader sr newStreamReader(fileName); stringstrsr.ReadLine (); sr.close();  StreamWriterrwFile.CreateText(Server.MapPath(".")"\myText.txt");   rw.WriteLine("写入…

Java程序员的推荐阅读书籍

作为Java程序员来说&#xff0c;最痛苦的事情莫过于可以选择的范围太广&#xff0c;可以读的书太多&#xff0c;往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些&#xff0c;按照学习的先后顺序&#xff0c;推荐给大家&#xff0c;特别是那些想不断提高自己技术水…

【转】Win10系统创建WiFi热点的两种方法

现在电脑和wifi已经成为很多人生活中不可缺少的一部分&#xff0c;上网过程只有连接WiFi才可以上网。使用windows10系统开启WiFi热点都是提示没有找到支持的无线网卡。不管你是驱动更新&#xff0c;重装&#xff0c;还是怎么操作都是不能用。为此&#xff0c;大家不妨参考下文方…