java二叉树的建立与应用代码

合集下载

二叉树的建立与基本操作

二叉树的建立与基本操作

二叉树的建立与基本操作二叉树是一种特殊的树形结构,它由节点(node)组成,每个节点最多有两个子节点。

二叉树的基本操作包括建立二叉树、遍历二叉树、查找二叉树节点、插入和删除节点等。

本文将详细介绍二叉树的建立和基本操作,并给出相应的代码示例。

一、建立二叉树建立二叉树有多种方法,包括使用数组、链表和前序、中序、后序遍历等。

下面以使用链表的方式来建立二叉树为例。

1.定义二叉树节点类首先,定义一个二叉树节点的类,包含节点值、左子节点和右子节点三个属性。

```pythonclass Node:def __init__(self, value):self.value = valueself.left = Noneself.right = None```2.建立二叉树使用递归的方法来建立二叉树,先构造根节点,然后递归地构造左子树和右子树。

```pythondef build_binary_tree(lst):if not lst: # 如果 lst 为空,则返回 Nonereturn Nonemid = len(lst) // 2 # 取 lst 的中间元素作为根节点的值root = Node(lst[mid])root.left = build_binary_tree(lst[:mid]) # 递归构造左子树root.right = build_binary_tree(lst[mid+1:]) # 递归构造右子树return root```下面是建立二叉树的示例代码:```pythonlst = [1, 2, 3, 4, 5, 6, 7]root = build_binary_tree(lst)```二、遍历二叉树遍历二叉树是指按照其中一规则访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。

1.前序遍历前序遍历是指先访问根节点,然后访问左子节点,最后访问右子节点。

```pythondef pre_order_traversal(root):if root:print(root.value) # 先访问根节点pre_order_traversal(root.left) # 递归访问左子树pre_order_traversal(root.right) # 递归访问右子树```2.中序遍历中序遍历是指先访问左子节点,然后访问根节点,最后访问右子节点。

二叉树构造方法

二叉树构造方法

பைடு நூலகம்
R->data = ch;
Create(R->lch); Create(R->rch);
//创建左子树 //创建右子树
}
}
2)根据前序遍历序列和中序遍历序列构造二叉链表的二叉树
如图 5-2 所示的二叉树的前序序列和中序序列为:ABDEFCGH 和 DBFEAGHC,则如 何创建二叉链表的二叉树呢?
编程思路:
递归实现创建操作时用来表示的结点的类型为指针的引用*&,这是通过函数参数传 递来使用的,目的是将指针本身传递给函数;非递归实现过程中没有参数调用,无法使 用*&类型,因此使用 **来传递结点指针的地址。
c.以类前序序列做为输入进行实现。
程序代码:
template <class T>
void BiTree<T>::Create(BiNode<T>** R)
{ BiNode<T>** stack[MAXSIZE]; int top =-1;
//定义顺序栈 //栈顶指针
char ch;
do
{
cin>>ch;
while(ch!=’#’)
{ *R = new BiNode<T>;
//创建结点,保存根结点指针的地址
(*R)->data=ch;
(*R)->lch =(*R)->rch = NULL;
b.使用非递归的方法创建二叉树必须要注意输入的参数类型**;
首先,**是指针的指针,也就是**类型的变量存储的数据是一个指针的地址。举个 例子,已知 int a=5;则 int *p=&a; int **pp = &p;则变量 a、p、pp 的关系如图所示:

数据结构(二十四)二叉树的链式存储结构(二叉链表)

数据结构(二十四)二叉树的链式存储结构(二叉链表)

数据结构(⼆⼗四)⼆叉树的链式存储结构(⼆叉链表) ⼀、⼆叉树每个结点最多有两个孩⼦,所以为它设计⼀个数据域和两个指针域,称这样的链表叫做⼆叉链表。

⼆、结点结构包括:lchild左孩⼦指针域、data数据域和rchild右孩⼦指针域。

三、⼆叉链表的C语⾔代码实现:#include "string.h"#include "stdio.h"#include "stdlib.h"#include "io.h"#include "math.h"#include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 *//* ⽤于构造⼆叉树********************************** */int index=1;typedef char String[24]; /* 0号单元存放串的长度 */String str;Status StrAssign(String T,char *chars){int i;if(strlen(chars)>MAXSIZE)return ERROR;else{T[0]=strlen(chars);for(i=1;i<=T[0];i++)T[i]=*(chars+i-1);return OK;}}/* ************************************************ */typedef char TElemType;TElemType Nil=''; /* 字符型以空格符为空 */Status visit(TElemType e){printf("%c ",e);return OK;}typedef struct BiTNode /* 结点结构 */{TElemType data; /* 结点数据 */struct BiTNode *lchild,*rchild; /* 左右孩⼦指针 */}BiTNode,*BiTree;/* 构造空⼆叉树T */Status InitBiTree(BiTree *T){*T=NULL;return OK;}/* 初始条件: ⼆叉树T存在。

p o l l 方 法 的 基 本 概 念

p o l l 方 法 的 基 本 概 念

树的基本概念以及java实现二叉树(二)本文是我在学习了树后作的总结文章,接上篇文章,本节大致可以总结为:二叉树的遍历与实现(递归和非递归)获取二叉树的高度和度创建一棵二叉树其他应用(层序遍历,复制二叉树,判断二叉树是否相等)文章传送门:二叉树的遍历与实现递归实现二叉树的遍历非递归实现二叉树的遍历获取二叉树的高度和度获取二叉树高度获取二叉树的度非递归实现二叉树的遍历创建一棵二叉树其他应用(层序遍历,复制二叉树,判断二叉树是否相等)层序遍历通过前序遍历复制一棵二叉树判断两棵树是否相等4 二叉树的遍历与实现二叉树遍历:从树的根节点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问仅且一次。

普遍有三种遍历方式,前序、中序和后序;这里有两个关键词:访问和次序。

有一个基本思想要注意下:一个根结点+左右子树均可以看作一棵二叉树4.1 递归实现二叉树的遍历4.1.1 前序遍历基本思想:若二叉树为空,则返回。

否则从根结点开始,优先访问根结点,再前序遍历左子树,前序遍历右子树,即根——左——右图中按照前序遍历的访问结果为:A、B、D、G、H、C、E、I、F使用代码递归来实现前序遍历,如下所示:* 前序遍历(中左右)* output:A、B、D、G、H、C、E、I、F* @param rootpublic void preOrder(TreeNode root) {if (root == null) {System.out.println("preOrder data:" + root.getData());preOrder(root.leftChild);preOrder(root.rightChild);4.1.2 中序遍历基本思想:若二叉树为空,则返回。

否则优先中序遍历左子树,再访问根结点,再后序遍历右子树,即左——根——右图中按照中序遍历的访问结果为:G、D、H、B、A、E、I、C、F使用代码递归来实现中序遍历,如下所示:* 中序遍历(左中右)* output:G、D、H、B、A、E、I、C、F* @param rootpublic void midOrder(TreeNode root) {if (root == null) {midOrder(root.leftChild);System.out.println("midOrder data:" + root.getData());midOrder(root.rightChild);4.1.3 后序遍历基本思想:若二叉树为空,则返回。

二叉树的建立方法总结

二叉树的建立方法总结

⼆叉树的建⽴⽅法总结之前已经介绍了⼆叉树的四种遍历(如果不熟悉),下⾯介绍⼀些⼆叉树的建⽴⽅式。

⾸先需要明确的是,由于⼆叉树的定义是递归的,所以⽤递归的思想建⽴⼆叉树是很⾃然的想法。

1. 交互式问答⽅式这种⽅式是最直接的⽅式,就是先询问⽤户根节点是谁,然后每次都询问⽤户某个节点的左孩⼦是谁,右孩⼦是谁。

代码如下(其中字符'#'代表空节点):#include <cstdio>#include <cstdlib>using namespace std;typedef struct BTNode *Position;typedef Position BTree;struct BTNode{char data;Position lChild, rChild;};BTree CreateBTree(BTree bt, bool isRoot){char ch;if (isRoot)printf("Root: ");fflush(stdin); /* 清空缓存区 */scanf("%c", &ch);fflush(stdin);if (ch != '#'){isRoot = false;bt = new BTNode;bt->data = ch;bt->lChild = NULL;bt->rChild = NULL;printf("%c's left child is: ", bt->data);bt->lChild = CreateBTree(bt->lChild, isRoot);printf("%c's right child is: ", bt->data);bt->rChild = CreateBTree(bt->rChild, isRoot);}return bt;}int main(){BTree bt;bt = CreateBTree(bt, true);LevelOrderTraversal(bt); /* 层序遍历 */return0;}2. 根据先序序列例如输⼊序列ABDH##I##E##CF#J##G##(#表⽰空),则会建⽴如下图所⽰的⼆叉树思路和第⼀种⽅式很相似,只是代码实现细节有⼀点区别,这⾥给出创建函数BTree CreateBTree(){BTree bt = NULL;char ch;scanf("%c", &ch);if (ch != '#'){bt = new BTNode;bt->data = ch;bt->lChild = CreateBTree();bt->rChild = CreateBTree();}return bt;}3. 根据中序序列和后序序列和⽅式⼆不同的是,这⾥的序列不会给出空节点的表⽰,所以如果只给出先序序列,中序序列,后序序列中的⼀种,不能唯⼀确定⼀棵⼆叉树。

数据结构二叉树的基本操作代码

数据结构二叉树的基本操作代码

数据结构二叉树的基本操作代码x#include<iostream>using namespace std;//二叉树的结构struct TreeNode{int data;//节点的值TreeNode *left;//指向左子树TreeNode *right;//指向右子树};//插入节点void insert(TreeNode *&tree, int val){if(tree == NULL){tree = new TreeNode;tree->data = val;tree->left = tree->right = NULL;}else if(val<=tree->data)//小于根节点的值则插入到左子树 insert(tree->left, val);else if(val>tree->data)//大于根节点的值则插入到右子树 insert(tree->right,val);}//查找节点TreeNode* find(TreeNode *tree,int val){if (tree == NULL)//树为空,无法查找return NULL;else if (val == tree->data)//值和节点的值相等,返回该节点return tree;else if (val < tree->data)//值小于节点的值,查找左子树 return find(tree->left,val);else if (val > tree->data)//值大于节点的值,查找右子树 return find(tree->right,val);elsereturn NULL;//无法查找}//遍历二叉树//先序遍历void preOrder(TreeNode *tree){if(tree != NULL){cout<< tree->data <<'t'; //先访问根节点preOrder(tree->left); //再遍历左子树 preOrder(tree->right); //最后遍历右子树 }}//中序遍历void inOrder(TreeNode *tree){if(tree != NULL){inOrder(tree->left); //先遍历左子树 cout<< tree->data <<'t'; //再访问根节点inOrder(tree->right); //最后遍历右子树 }}//后序遍历void postOrder(TreeNode *tree){if(tree != NULL){postOrder(tree->left); //先遍历左子树 postOrder(tree->right); //再遍历右子树 cout<< tree->data <<'t'; //最后访问根节点 }}//查找最大值TreeNode* findMax(TreeNode *tree){if(tree == NULL)return NULL;else if(tree->right == NULL)return tree;elsereturn findMax(tree->right);}//查找最小值TreeNode* findMin(TreeNode *tree){if(tree == NULL)return NULL;else if(tree->left == NULL)return tree;elsereturn findMin(tree->left);}//删除节点void remove(TreeNode *&tree, int val){if(tree == NULL)return;else if(val < tree->data)remove(tree->left, val);else if(val > tree->data)remove(tree->right, val);else//找到要删除的节点{if(tree->left != NULL && tree->right != NULL)//左右子树均不为空{TreeNode *temp = tree;TreeNode *max = findMax(tree->left);//查找左子树的最大结点tree->data = max->data;//将最大结点的值替换到要删除的节点remove(temp->left, max->data);//将最大结点删掉}else//只有一边的子节点不为空或者左右节点都为空{TreeNode *temp = tree;if(tree->left == NULL)//如果左节点为空,就将右节点提升 tree = tree->right;else if(tree->right == NULL)//如果右节点为空,就将左节点提升tree = tree->left;delete temp;//删掉要删除的节点}}}int main(){TreeNode *tree = NULL; //声明一个空树int arr[10] = {12, 3, 4, 6, 7, 9, 10, 5, 2, 8};for(int i=0; i<10; i++){insert(tree, arr[i]);//把数组元素插入到树当中}cout<<'先序遍历:';preOrder(tree);cout<<endl;cout<<'中序遍历:';inOrder(tree);cout<<endl;cout<<'后序遍历:';postOrder(tree);cout<<endl;cout<<'查找节点数据:4';TreeNode *findNode = find(tree, 4);if(findNode != NULL)//如果节点存在cout<<'找到了,节点的值是:'<<findNode->data;else//如果节点不存在cout<<'没有找到';cout<<endl;cout<<'查找树的最大值:'<<findMax(tree)->data<<endl; cout<<'查找树的最小值:'<<findMin(tree)->data<<endl; cout<<'删除节点:。

java实现二叉树的基本操作

java实现二叉树的基本操作

java实现二叉树的基本操作一、二叉树的定义树是计算机科学中的一种基本数据结构,表示以分层方式存储的数据集合。

树是由节点和边组成的,每个节点都有一个父节点和零个或多个子节点。

每个节点可以对应于一定数据,因此树也可以被视作提供快速查找的一种方式。

若树中每个节点最多只能有两个子节点,则被称为二叉树(Binary Tree)。

二叉树是一种递归定义的数据结构,它或者为空集,或者由一个根节点以及左右子树组成。

如果左子树非空,则左子树上所有节点的数值均小于或等于根节点的数值;如果右子树非空,则右子树上所有节点的数值均大于或等于根节点的数值;左右子树本身也分别是二叉树。

在计算机中实现二叉树,通常使用指针来表示节点之间的关系。

在Java中,定义一个二叉树节点类的代码如下:```public class BinaryTree {int key;BinaryTree left;BinaryTree right;public BinaryTree(int key) {this.key = key;}}```在这个类中,key字段表示该节点的数值;left和right字段分别表示这个节点的左右子节点。

1. 插入节点若要在二叉树中插入一个节点,首先需要遍历二叉树,找到一个位置使得插入新节点后,依然满足二叉树的定义。

插入节点的代码可以写成下面这个形式:```public void insert(int key) {BinaryTree node = new BinaryTree(key); if (root == null) {root = node;return;}BinaryTree temp = root;while (true) {if (key < temp.key) {if (temp.left == null) {temp.left = node;break;}temp = temp.left;} else {if (temp.right == null) {temp.right = node;break;}temp = temp.right;}}}```上面的代码首先创建了一个新的二叉树节点,然后判断二叉树根是否为空,若为空,则将这个节点作为根节点。

写出由后根和中根遍历序列建二叉树的算法

写出由后根和中根遍历序列建二叉树的算法

写出由后根和中根遍历序列建二叉树的算法由后根和中根遍历序列建二叉树的算法,可以分为以下几个步骤:1. 从后根遍历序列中选取最后一个节点作为根节点。

2. 在中根遍历序列中找到根节点的位置,将中根遍历序列分为左右两个子序列。

3. 根据左子序列和右子序列的长度,将后根遍历序列分为左右两个子序列。

4. 递归处理左子树和右子树,分别以左子序列和右子序列为后根遍历序列,以左子序列和右子序列为中根遍历序列。

具体实现可以参考以下的伪代码:```function buildTree(postorder, inorder)if postorder is empty or inorder is emptyreturn null// 从后根遍历序列中选取最后一个节点作为根节点root = stnode = new TreeNode(root)// 在中根遍历序列中找到根节点的位置index = inorder.indexOf(root)// 将中根遍历序列分为左右两个子序列leftInorder = inorder[0...index-1]rightInorder = inorder[index+1...inorder.length-1]// 根据左子序列和右子序列的长度,将后根遍历序列分为左右两个子序列leftPostorder = postorder[0...leftInorder.length-1]rightPostorder = postorder[leftInorder.length...postorder.length-2]// 递归处理左子树和右子树node.left = buildTree(leftPostorder, leftInorder)node.right = buildTree(rightPostorder, rightInorder)return node```以上就是由后根和中根遍历序列建二叉树的算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b1.setRight(b11);
Tree<String> a = new Tree<String>("a");
a.setLeftChild(a1);
a.setRight(b1);
String c11 = null;//定义一个字符串型的变量c11,初始值为null
System.out.print(a.exists(c11));//判断二叉树a中是否含有c11
public class Tree<T> {//定义一个二叉树类
private T root;
public T getRoot() {
return root;
}
public void setRoot(T root) {
this.root = root;
}
//get()函数与set()函数成对出现,来设定变量的值
return root==null;
}
public boolean exists(T data) {
root==null) return false;
if(data!=null) {
if(!isEmptyTree() && root.equals(data)) return true;//如果树不空,而且根等于data返回true
if(!leftChild.isEmptyTree() && leftChild.exists(data)) return true;
if(!right.isEmptyTree() && right.exists(data)) return true;
}
return false;
}
/**
* @param args
public Tree<T> getLeftChild() {
return leftChild;
}
public void setLeftChild(Tree<T> leftChild) {
this.leftChild = leftChild;
}
public Tree<T> getRight() {
return right;
}
}
Tree<String> a1 = new Tree<String>("a1");
a1.setLeftChild(a11);
a1.setRight(a12);
Tree<String> b11 = new Tree<String>("b11");
Tree<String> b1 = new Tree<String>("b1");
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Tree<String> a11 = new Tree<String>("a11");
Tree<String> a12 = new Tree<String>("a12");
}
public void setRight(Tree<T> right) {
this.right = right;
}
private Tree<T> leftChild;
private Tree<T> right;
public Tree(T root) {
this.root= root;
}
public boolean isEmptyTree() {
相关文档
最新文档