二叉链表:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h> //1
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode; typedef struct BiTNode * BiTree; //2
//第二种表示方法 三叉链表
//三叉链表
typedef struct TriTNode
{
int data;
//左右孩子指针
struct TriTNode *lchild, *rchild;
struct TriTNode *parent;
}TriTNode, *TriTree; //双亲链表
#define MAX_TREE_SIZE 100
typedef struct BPTNode
{
int data;
int parentPosition; //指向双亲的指针 //数组下标
char LRTag; //左右孩子标志域
}BPTNode; typedef struct BPTree
{
BPTNode nodes[]; //因为节点之间是分散的,需要把节点存储到数组中
int num_node; //节点数目
int root; //根结点的位置 //注意此域存储的是父亲节点在数组的下标
}BPTree; //用这个数据结构能表达出一颗树。。。能,怎么表达?不能why void main()
{
BPTree myTree; // myTree.root = ; //数组的0号位置 是根结点
myTree.nodes[].data = 'A'; //B
myTree.nodes[].data = 'B';
myTree.nodes[].parentPosition = ;
myTree.nodes[].LRTag = ; //C
myTree.nodes[].data = 'C';
myTree.nodes[].parentPosition = ;
myTree.nodes[].LRTag = ; system("pause");
} void main11()
{
BiTNode nodeA, nodeB, nodeC, nodeD, nodeE; nodeA.lchild = NULL;
nodeA.rchild = NULL;
nodeA.data = ;
memset(&nodeA, , sizeof(BiTNode));
memset(&nodeB, , sizeof(BiTNode));
memset(&nodeC, , sizeof(BiTNode));
memset(&nodeD, , sizeof(BiTNode));
memset(&nodeE, , sizeof(BiTNode)); nodeA.data = ;
nodeA.lchild = &nodeB;
nodeA.rchild = &nodeC;
nodeB.lchild = &nodeD;
nodeC.lchild = &nodeE; printf("hello...\n");
system("pause");
return ;
}

中序非递归:

#include <iostream>
using namespace std; #include "stack" //1
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode; typedef struct BiTNode * BiTree; //递归 中序遍历
void InOrder(BiTNode *T)
{
if (T == NULL)
{
return ;
} if (T->lchild != NULL)
{
InOrder(T->lchild);
} printf("%d ", T->data); // if (T->rchild != NULL)
{
InOrder(T->rchild);
}
} BiTNode * GoFarLeft(BiTNode *T, stack<BiTNode *> &s)
{
if (T ==NULL)
{
return NULL;
}
while (T->lchild != NULL) //一直往左走 ,找到中序遍历的起点
{
s.push(T);
T = T->lchild; //让指针下移
}
return T; //
} void MyInOrder(BiTNode *T)
{
stack<BiTNode *> s; //
BiTNode *t = GoFarLeft(T, s); //一直往左走 找到中序遍历的起点 while (t != NULL)
{
printf("%d ", t->data); //若结点 有右子树,重复步骤1
if (t->rchild != NULL)
{
t = GoFarLeft(t->rchild, s);
}
//若结点 没有右子树 看栈是否为空
else if ( !s.empty() )
{
t = s.top(); //把栈顶弹出
s.pop();
}
else
{
t = NULL;
}
}
} void main()
{
BiTNode nodeA, nodeB, nodeC, nodeD, nodeE; nodeA.lchild = NULL;
nodeA.rchild = NULL;
nodeA.data = ;
memset(&nodeA, , sizeof(BiTNode));
memset(&nodeB, , sizeof(BiTNode));
memset(&nodeC, , sizeof(BiTNode));
memset(&nodeD, , sizeof(BiTNode));
memset(&nodeE, , sizeof(BiTNode)); nodeA.data = ;
nodeB.data = ;
nodeC.data = ;
nodeD.data = ;
nodeE.data = ; nodeA.lchild = &nodeB;
nodeA.rchild = &nodeC;
nodeB.lchild = &nodeD;
nodeC.lchild = &nodeE; printf("\n中序遍历递归算法");
InOrder(&nodeA); printf("\n中序遍历非递归算法");
MyInOrder(&nodeA); cout<<"hello..."<<endl;
system("pause");
return ;
}

数的操作:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h> //1
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode; typedef struct BiTNode * BiTree; //先序遍历
void preOrder(BiTNode *T)
{
if (T == NULL)
{
return ;
}
printf("%d ", T->data); // if (T->lchild != NULL)
{
preOrder(T->lchild);
} if (T->rchild != NULL)
{
preOrder(T->rchild);
}
} void InOrder(BiTNode *T)
{
if (T == NULL)
{
return ;
} if (T->lchild != NULL)
{
InOrder(T->lchild);
} printf("%d ", T->data); // if (T->rchild != NULL)
{
InOrder(T->rchild);
}
} void PostOrder(BiTNode *T)
{
if (T == NULL)
{
return ;
} if (T->lchild != NULL)
{
PostOrder(T->lchild);
} if (T->rchild != NULL)
{
PostOrder(T->rchild);
} printf("%d ", T->data); //
} /*
1
2 3
4 5
*/ //求树的叶子结点的个数 int sum = ;
void coutLeafNum(BiTNode *T)
{
if (T == NULL)
{
return ;
}
if (T->lchild == NULL && T->rchild ==NULL)
{
sum ++;
}
coutLeafNum(T->lchild); //求左子树的叶子结点个数 coutLeafNum(T->rchild); //求右子树 叶子结点个数
} //1 递归函数遇上全局变量 ===>函数参数
//2 //遍历的本质 强化
//访问树的路径是相同的,是不过是计算叶子结点的时机不同.... void coutLeafNum2(BiTNode *T, int *sum)
{
if (T == NULL)
{
return ;
}
if (T->lchild == NULL && T->rchild ==NULL)
{
//*sum++;
//*sum = *sum +1;
(*sum )++ ; //++后置 ++ 先*p 然后sum++
//1 p++ //1 是让实参++ 而不是让地址++
} coutLeafNum2(T->lchild, sum); //求左子树的叶子结点个数 coutLeafNum2(T->rchild, sum); //求右子树 叶子结点个数
} void coutLeafNum3(BiTNode *T, int *sum)
{
if (T == NULL)
{
return ;
} coutLeafNum3(T->lchild, sum); //求左子树的叶子结点个数 coutLeafNum3(T->rchild, sum); //求右子树 叶子结点个数 if (T->lchild == NULL && T->rchild ==NULL)
{
(*sum )++ ; //计算叶子结点
}
} //求树的高度
int Depth(BiTNode *T)
{
int depthval = ;
int depthLeft = , depthRight = ; if (T == NULL)
{
return ;
} depthLeft = Depth(T->lchild); //求左子树的高度
depthRight = Depth(T->rchild); //求右子树的高度 //1 + 谁大要谁
depthval = + ( (depthLeft>depthRight) ? depthLeft :depthRight );
return depthval;
} //copy二叉树
BiTNode* CopyTree(BiTNode *T)
{
BiTNode *newlptr = NULL;
BiTNode *newRptr = NULL;
BiTNode *newNode = NULL; if (T == NULL)
{
return NULL;
} newlptr = CopyTree(T->lchild);
newRptr = CopyTree(T->rchild); //new结点
newNode = (BiTNode *)malloc(sizeof(BiTNode)) ; //
if (newNode == NULL)
{
return NULL;
} newNode->data = T->data; //从旧树中copy数据
newNode->lchild = newlptr; //新的左子树
newNode->rchild = newRptr; //新的右子树
return newNode;
} void main()
{
BiTNode nodeA, nodeB, nodeC, nodeD, nodeE; nodeA.lchild = NULL;
nodeA.rchild = NULL;
nodeA.data = ;
memset(&nodeA, , sizeof(BiTNode));
memset(&nodeB, , sizeof(BiTNode));
memset(&nodeC, , sizeof(BiTNode));
memset(&nodeD, , sizeof(BiTNode));
memset(&nodeE, , sizeof(BiTNode)); nodeA.data = ;
nodeB.data = ;
nodeC.data = ;
nodeD.data = ;
nodeE.data = ; nodeA.lchild = &nodeB;
nodeA.rchild = &nodeC;
nodeB.lchild = &nodeD;
nodeC.lchild = &nodeE; //拷贝二叉树
{
BiTNode *newTree = NULL;
newTree = CopyTree(&nodeA);
printf("\n中序遍历新树:");
InOrder(newTree);
} {
//求树的高度
int depth = Depth(&nodeA);
printf("depth:%d \n", depth); } //计算树的叶子结点
{
int mysum = ;
coutLeafNum(&nodeA);
printf("sum:%d \n", sum); coutLeafNum2(&nodeA, &mysum);
printf("mysum:%d \n", mysum); mysum = ;
coutLeafNum3(&nodeA, &mysum);
printf("mysum:%d \n", mysum); } //printf("\n先序遍历树: ");
//preOrder(&nodeA); printf("\n中序遍历树: ");
InOrder(&nodeA); //printf("\n后序遍历树: ");
//PostOrder(&nodeA); system("pause");
}

C 二叉树 1的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. 二叉树的递归实现(java)

    这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...

  3. c 二叉树的使用

    简单的通过一个寻找嫌疑人的小程序 来演示二叉树的使用 #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  4. Java 二叉树遍历右视图-LeetCode199

    题目如下: 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样. 换成通俗的意思:按层遍历二叉树,输出每层的最右端结点. 这就明白时一道二叉树层序遍历的问题,用一个队 ...

  5. 数据结构:二叉树 基于list实现(python版)

    基于python的list实现二叉树 #!/usr/bin/env python # -*- coding:utf-8 -*- class BinTreeValueError(ValueError): ...

  6. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  7. [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...

  8. [LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化

    One way to serialize a binary tree is to use pre-oder traversal. When we encounter a non-null node, ...

  9. [LeetCode] Binary Tree Vertical Order Traversal 二叉树的竖直遍历

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  10. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

随机推荐

  1. Gentoo源码安装图解

    Gentoo源码安装 一.前期准备 (1)下载以下三个文件 二.配置安装环境 (1)用光盘引导到LiveCD环境 (2)配置当前LiveCD环境的网络 安装Gentoo时,服务器引导的LiveCD环境 ...

  2. spring-security用户权限认证框架

    大家知道在spring中有一个基于acegi开发的spring-security的权限管理模块,它是一个轻量级框架. SpringSecurity能以声明的方式来保护Web应用程序的URL访问,只需简 ...

  3. Java [leetcode 20]Valid Parentheses

    题目描述: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if th ...

  4. oracle导入到Excel

    一.从oracle到处数据到excel文件方法一.直接从PL/SQL中,全选数据,然后复制粘贴到excel中: 方法二.同样是通过PL/SQL,在数据列中,点击右键-->导出结果-->选择 ...

  5. 学习Erlang--1、入门

    1.正式起航 从前,一名程序员偶然读到了一本古怪的语言图书,相等其实不是相等,变量其实是不能改变的,语法是那么陌生,它甚至不是面向对象,这些程序实在是太过另类…… 另类的不仅仅是程序,编程的教学步骤也 ...

  6. C# 中的装箱与拆箱

    转角撞倒猪 原文 C# 中的装箱与拆箱   装箱:将一个数据项(副本)从栈中自动复制到堆中的行为. int i = 8; object o = i; // 装箱 // 首先在堆中开辟出一片区域,再将 ...

  7. Velocity - 单例还是非单例

    在Velocity1.2版本以后,开发者现在又两种选择来使用Velocity引擎,单例模型(singleton model)和单独实例模型(separate instance model).这是相同的 ...

  8. python 网络编程(一)---基础

    1.理解TCP 1.1 寻址 首先任何基于TCP/IP的网络,每台机器都有唯一的IP地址,只需要知道接受者机器的IP地址,信息就可以传送过去. 其次,TCP通过使用端口号来知道机器究竟是哪个程序应该接 ...

  9. Leetcode OJ : Implement strStr() [ Boyer–Moore string search algorithm ] python solution

    class Solution { public: int strStr(char *haystack, char *needle) { , skip[]; char *str = haystack, ...

  10. 【暑假】[实用数据结构]UVAlive 4329 Ping pong

    UVAlive 4329 Ping pong 题目: Ping pong Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: % ...