`

快排与二叉树的高度 宽度问题

    博客分类:
  • Java
 
阅读更多

2016.10.05

 

快速排序(Quicksort)是对冒泡排序的一种改进。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
如图:
       
class Quick
{
 public void sort(int arr[],int low,int high)
 {
 int l=low;
 int h=high;
 int povit=arr[low];
 
 while(l<h)
 {
 while(l<h&&arr[h]>=povit)
 h--;
 if(l<h){
 int temp=arr[h];
 arr[h]=arr[l];
 arr[l]=temp;
 l++;
 }
 
 while(l<h&&arr[l]<=povit)
 l++;
 
 if(l<h){
 int temp=arr[h];
 arr[h]=arr[l];
 arr[l]=temp;
 h--;
 }
 }
 print(arr);
 System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");
 if(l>low)sort(arr,low,l-1);
 if(h<high)sort(arr,l+1,high);
 }
}
 面试题:二叉树的深度
题目:输入一课二叉数的根节点,求该数的深度。从根节点到叶子结点一次经过的结点形成的一条路径,最长路径的长度为树的深度。根结点的深度为1.

解体思路:

    1.如果根节点为空,则深度为0,返回0,递归的出口

    2.如果根节点不为空,那么深度至少为1,然后我们求他们左右子树的深度,

    3.比较左右子树深度值,返回较大的那一个

    4.通过递归调用  

       代码实现:


#include<iostream>
#include<stdlib.h>
using namespace std;

struct BinaryTreeNode
{
    int m_nValue;
    BinaryTreeNode* m_pLeft;
    BinaryTreeNode* m_pRight;
};

//创建二叉树结点
BinaryTreeNode* CreateBinaryTreeNode(int value)
{
    BinaryTreeNode* pNode=new BinaryTreeNode();
    pNode->m_nValue=value;
    pNode->m_pLeft=NULL;
    pNode->m_pRight=NULL;
    return pNode;
}

//连接二叉树结点
void ConnectTreeNodes(BinaryTreeNode* pParent,BinaryTreeNode* pLeft,BinaryTreeNode* pRight)
{
    if(pParent!=NULL)
    {
        pParent->m_pLeft=pLeft;
        pParent->m_pRight=pRight;
    }
}

//求二叉树深度
int TreeDepth(BinaryTreeNode* pRoot)//计算二叉树深度
{
    if(pRoot==NULL)//如果pRoot为NULL,则深度为0,这也是递归的返回条件
        return 0;
    //如果pRoot不为NULL,那么深度至少为1,所以left和right=1
    int left=1;
    int right=1;
    left+=TreeDepth(pRoot->m_pLeft);//求出左子树的深度
    right+=TreeDepth(pRoot->m_pRight);//求出右子树深度

    return left>right?left:right;//返回深度较大的那一个
}

void main()
{
//            1
//         /      \
//        2        3
//       /\         \
//      4  5         6
//           /
//        7
    //创建树结点
    BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
    BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
    BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
    BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
    BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
    BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
    BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);

    //连接树结点
    ConnectTreeNodes(pNode1, pNode2, pNode3);
    ConnectTreeNodes(pNode2, pNode4, pNode5);
    ConnectTreeNodes(pNode3, NULL,   pNode6);
    ConnectTreeNodes(pNode5, pNode7,  NULL );

    int depth=TreeDepth(pNode1);
    cout<<depth<<endl;

    system("pause");
}

 

  • 大小: 25 KB
分享到:
评论

相关推荐

    求二叉树最大宽度 求二叉树最大宽度 数据结构

    在探讨“求二叉树最大宽度”的数据结构问题时,我们深入分析了如何通过特定算法找到一棵二叉树中每一层节点的最大数量,这一过程涉及到了数据结构与算法设计的关键概念和技术。 ### 一、二叉树的概念 二叉树是一种...

    二叉树的高度和宽度

    在实际应用中,理解并掌握二叉树的高度和宽度非常重要,它们常用于优化搜索算法、平衡树的构建以及解决各种复杂问题。例如,在二叉搜索树中,平衡树(如AVL树和红黑树)的高度直接影响查找、插入和删除操作的效率。...

    数据结构中求二叉树的高度和宽度C++代码

    ### 数据结构中求二叉树的高度和宽度C++代码 #### 概述 本文将详细介绍如何使用C++来实现计算二叉树的高度和宽度的方法。文章中的代码适用于初学者学习和理解二叉树的基本操作。 #### 二叉树简介 二叉树是一种...

    数据结构课程设计二叉树的宽度

    "数据结构课程设计二叉树的宽度" 本次课程设计的主题是计算二叉树的宽度,即从上往下计算出各层中结点数的最大值。该设计主要解决了两个问题:一是根据先序序列的输入创建二叉树链表结构;二是从上到下计算各层节点...

    C++数据结构-计算二叉树最大的宽度

    在这个问题中,我们要计算二叉树的最大宽度,也就是树中任意一层的最大节点数。 首先,我们需要定义二叉树的节点结构。在C++中,这可以通过创建一个结构体或类来实现: ```cpp struct TreeNode { int val; ...

    有关二叉树的高度,宽度计算,以及相关度节点的个数算法,以及前序递归初始化二叉树

    解决二叉树初始化,宽度,高度,最大节点,是否为完全二叉树的判断

    求二叉树高度

    二叉树高度 二叉树高度 二叉树高度 二叉树高度 二叉树高度

    erchashu.rar_二叉树的宽度

    了解二叉树的宽度不仅有助于理解树的结构特性,还在解决实际问题中起到关键作用,例如在寻找平衡二叉树、构建特定宽度的二叉树等问题上。熟悉并掌握这些概念和算法对于任何IT从业者来说都是非常有价值的。

    二叉树的建立、遍历,宽度

    二叉树的建立,前序、中序、后序、层序遍历,求二叉树的宽度

    二叉链表作存储结构,设计求二叉树高度的算法

    以二叉链表作存储结构,设计求二叉树高度的算法。

    教你怎么求二叉树的高度

    根据给定的信息,本文将详细解释如何计算二叉树的高度,并深入探讨相关的数据结构与算法原理。 ### 一、二叉树的基本概念 在计算机科学中,二叉树是一种非常重要的非线性数据结构,它具有以下特点: 1. **二叉树*...

    二叉树的创建遍历以及求二叉树的高度程序源码

    二叉树的创建遍历以及求二叉树的高度程序源码 先序创建 前序遍历 树的层次

    二叉树的宽度求解问题(算法与数据结构设计)

    设二叉树的宽度定义为具有结点数最多的那一层上的结点个数。试设计算法求二叉树的宽度,并输出各结点的高度。(与另一份源码不同)

    二叉树的宽度求解问题(C++数据结构)

    设二叉树的宽度定义为具有结点数最多的那一层上的结点个数。试设计算法求二叉树的宽度,并输出各结点的高度。(包含提高)

    C语言中计算二叉树的宽度的两种方式

    在C语言中,计算二叉树的宽度是一个常见的问题,主要涉及到数据结构和算法的知识。二叉树是一种每个节点最多有两个子节点的数据结构,通常分为左子节点和右子节点。计算二叉树的宽度,即找出树中最宽的一层包含的...

    Java实现 LeetCode 662 二叉树最大宽度(递归)

    【二叉树最大宽度问题详解】 在计算机科学中,二叉树是一种常见的数据结构,其特点是每个节点最多有两个子节点。在LeetCode的第662题中,我们需要找到给定二叉树的最大宽度。这道题的目标是计算树的所有层中最大的...

    二叉树先序中序后序递归非递归遍历并求高度

    (1)输入字符序列,建立二叉链表 (2)中序遍历二叉树:递归 (3)中序遍历二叉树:非递归 (3)二叉树高度

    树 二叉树 各种操作 删除叶节点 返回宽度 高度 等

    本程序聚焦于二叉树的基本操作,特别是针对叶节点的删除、计算树的宽度和高度等任务,这些都是二叉树操作的基础和核心。 首先,让我们详细讨论二叉树的定义。二叉树是由n(n&gt;=0)个有限节点组成的一个有根的层次...

    二叉树的建立与遍历

    每棵子树又都是二叉树,所以构造一棵子树的过程与构造整棵二叉树的过程完全相同(采用递归形式直到叶子结点为止)。 2) 先序序列的输入:从键盘输入任意一棵二叉树的先序序列,用#代表空指针,如下图所示的二叉树,...

    根据给定的二叉树,求二叉树的高度

    根据给定的二叉树,求二叉树的高度;求给定结点的所有祖先。 要求:(1)根据性质5 建立二叉树的二叉链表; (2)遍历算法必须采用非递归算法。

Global site tag (gtag.js) - Google Analytics