二叉树实例学习(二)

测试是否有左孩子 hasLChild(x)、右孩子函数 hasRChild(x),以及是否右孩子函数 hasChild(x) 。

节点头文件:

#ifndef BINNODE_H
#define BINNODE_H
#include <iostream>
//***************************************************************************************
///代码5.2 , BinNode状态与性质的判断
///一、 判断该节点是什么!
/// 是否是根节点、是否是左子节点、是否是右子节点、是否是叶节点
#define isRoot(x) (!((x).parent))
#define isLChild(x) (!isRoot(x)&&(&(x)==(x).parent->lc))  //不是根节点,同时必须是父节点的左孩子
#define isRChild(x) (!isRoot(x)&&(&(x)==(x).parent->rc))  //不是根节点,同时必须是父节点的右孩子
///二、判断该节点有什么
//判断是否有孩子
#define hasLChild(x) ((x).lc!=NULL)  //判断节点x是否有左孩子
#define hasRChild(x) ( (x).rc )      //判断节点x 是否有右孩子
#define hasChild(x)  ( hasLChild(x)||hasRChild(x))  //判断节点x是否有孩子(左、右至少有一个)
//判断是否为叶节点
#define isLeaf(x)   ( !hasChild(x) )   //判断节点x是否是叶子节点

//****************************************************************************************
#define BinNodePosi(T) BinNode<T>* //节点位置

typedef enum{RB_RED,RB_BLACK} RBColor;//节点颜色

template <typename T>
class BinNode
{
public:
    T data;//数值
    int height;
    int npl;//Null Path Length(左式堆,也可直接用height代替)
    RBColor color;
    BinNodePosi(T) parent;//父节点
    BinNodePosi(T) lc;//左子节点
    BinNodePosi(T) rc;//右子节点
    //构造函数
    BinNode():parent(NULL),lc(NULL),rc(NULL),height(0),npl(1),color(RB_RED){}
    BinNode(T e,BinNodePosi(T) p=NULL,BinNodePosi(T) lc=NULL,BinNodePosi(T) rc=NULL,
            int h=0,int l=1,RBColor c=RB_RED)
    {
        data=e;
        parent=p;
        this->lc=lc,this->rc=rc;//此处添加this指针,以便将成员变量lc、rc与形参lc和rc区分

        height=h;
        npl=l;
        color=c;
    }
};

#endif // BINNODE_H

下面是测试实例代码:

#include <iostream>
#include <binnode.h>
#include <string>
using namespace std;
//1、测试根节点函数isRoot
void testRoot(BinNode<string> &node)
{
    if(isRoot(node))
        cout<<node.data<<" is root!"<<endl;
    else
        cout<<node.data<<" is not a root!"<<endl;
}
//2、测试左孩子函数isLChild
void testLChild(BinNode<string> &node)
{
    if(isLChild(node))
        cout<<node.data<<" is left child!"<<endl;
    else
        cout<<node.data<<" is not left child!"<<endl;
}
//3、测试右孩子函数isRChild
void testRChild(BinNode<string> &node)
{
    if(isRChild(node))
        cout<<node.data<<" is "<<node.parent->data<< "‘s right child!"<<endl;
    else
        cout<<node.data<<" is not right child!"<<endl;
}
//4、测试是否有左孩子函数

void testHasLChild(BinNode<string> &node)
{
    if(hasLChild(node))
        cout<<node.data<<" has a left child: "<<endl;
    else
        cout<<node.data<<" has not left child!"<<endl;
}

//5、测试是否是叶节点函数isLeaf()
void testLeaf(BinNode<string> &node)
{
    if(isLeaf(node))
        cout<<node.data<<" is "<<node.parent->data<< "‘s leaf!"<<endl;
    else
        cout<<node.data<<" is not leaf"<<endl;
}

int main()
{
    BinNode<string> n1("node1");
    BinNode<string> n0("node0");
    BinNode<string> n2("node2");
    BinNode<string> n3("node3");
    //2、将n2设定为n1的左节点,测试isLChild()函数
    n1.lc=&n2;
    n2.parent=&n1;
    testLChild(n2);
    //3、将n3设定为n1的右节点,测试isRChild()函数
    n1.rc=&n3;
    n3.parent=&n1;//创建n1、n3之间的父子关系
    testRChild(n3);
    //4、测试n3是否有左孩子
    testHasLChild(n2);
    //5、测试叶节点函数isLeaf
    testLeaf(n3);
    return 0;
}

下面是测试结果:

原文地址:https://www.cnblogs.com/phoenixdsg/p/9737361.html

时间: 2024-10-15 10:36:05

二叉树实例学习(二)的相关文章

数据结构之---C语言实现二叉树的二叉链表存储表示

//二叉树的二叉链表存储表示 //杨鑫 #include <stdio.h> #include <stdlib.h> #define max(a, b) a > b ? a : b //自定义max()函数 typedef char TELemType; //定义结二叉树的构体 typedef struct BTree { TELemType data; struct BTree *lChild; struct BTree *rChild; }BinTree; //二叉树的创

二叉树的二叉链表表示和实现

二叉树的二叉链表存储结构 typedef struct BiTNode { TElemType data; BiTNode * lchild, *rchild;//左右孩子指针 }BiTNode, * BiTree; 二叉链表的22个基本操作 #define ClearBiTree DestroyBiTree//清空二叉树和销毁二叉树的操作一样 void InitBiTree(BiTree &T){ T = NULL; } void DestroyBiTree(BiTree &T){ if

二叉树的二叉链表存储

1. 版本信息 (1)CentOS 6.4发行版64位,uname -a 显示如下: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov 2 23:25:40 KST 2013 x86_64 x86_64 x86_64 GNU/Linux (2)Eclipse: Version: Kepler Service Release 2 (3)Tomcat: apache-tomcat-7.0.53 (4)Mysql:      mysql-server-

二叉树(二)——遍历、深度统计、叶子结点统计、结点统计

1.二叉树的相关算法的实现(链表). #include <stdio.h> #include <malloc.h> #define NULL 0 typedef struct tree { int data; struct tree *left, *right; }ElemBT; void create_btree(ElemBT *root, int list[], int n) /*n表示list数组中元素的个数*/ { int i; ElemBT *current, *pare

二叉树的二叉链表存储结构

一.二叉树的二叉链表存储结构 二叉树的二叉链表存储结构及其操作应用广泛,各大IT公司面试的时候都很喜欢考察二叉树的奇异操作,但是万变不离其宗,只要熟练掌握二叉树的二叉链表存储结构及其基本操作,其它奇异操作根据需要进行变换即可.如下所示: typedef char TElemType; TElemType Nil = ' '; typedef struct BiTNode { TElemType data; // 结点的值 BiTNode *lchild, *rchild; // 左右孩子指针 }

GUI 控件实例学习二(C#)

using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { public GUISkin myGUISking; private Rect windowRect; private Vector2 scrollPosition; string info=" 测试测试测试测试测试测试测试测试测试测试 \n " + "测试测试测试测试测试测试测试测试\n测试测试测试测试测试测

二叉树的二叉链表存储及其Java实现

二叉链表存储的思想是让每个节点都记住它的左.右两个子节点,为每个节点增加left.right两个指针,分别引用该节点的左.右两个子节点,如图所示: 其中,每个节点大致有如下定义: class Node{ T data; Node left; Node right; } 对于这种二叉链表存储的二叉树,如果程序需要,为指定节点添加子节点也非常容易,让父节点的left.right引用指向新节点即可. Java实现代码: package com.liuhao.DataStructures; public

二叉树的二叉链表存储结构及C++实现

前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linked list)存储,其基本思想是:令二叉树的每一个结点对应一个链表结点链表结点除了存放与二叉树结点有关的数据信息外,还要设置指示左右孩子的指针.二叉链表的结点结构如下图所示: 二叉树结点结构 lchild data rchild 其中,data为数据域,存放该结点的数据信息: lchild为左指针域

二叉树学习二:二叉搜索树

二叉搜索树(Binary Search Tree),或者是一棵空树,或者: 1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 3)二叉搜索树的左.右子树也分别为二叉搜索树. 搜索二叉树相关的算法实现: 1)搜索二叉树的创建与转化为双链表实现: 1 #include "stdafx.h" 2 #include<iostream> 3 using namespace std; 4 5 /*二无