《数据结构和算法》【二叉树】C++链表描述
定义
二叉树是用有限个线段连接的有限个节点的集合,有一个唯一的特殊节点叫根节点,其余的节点,要么是树中某个节点的左节点,要么是树中某个节点的右节点。某个节点的左节点与某个节点的右节点通过线段连接。
属性
二叉树有一些属性,能帮助了解二叉树。
1、二叉树的每个元素都恰好有两个子树,其中可能有一个或两个是空的。
2、子树分左子树和右子树,顺序不能混淆
3、边数=节点数-1:一颗二叉树的连接线段数目,刚好是它的节点数目减一。
4、层数:节点有对应的层数,根节点在第一层,子节点的层数为父节点的层数加一。
4、高度:二叉树的最大层数,称为高度。
5、已知高度为h,则最少节点数为h,最大节点数为2的h次方-1。
6、满二叉树:二叉树的节点个数为2的h次方-1.
7、完全二叉树:将某二叉树的节点从左往右、从上往下依次编号(1、2、。。。),对应位置的编号与相同高度的满二叉树的对应节点的编号完全相同。
二叉树的遍历
遍历分为前序遍历、中序遍历、后序遍历。
二叉树的当前节点:一般指中间的节点、父节点,要相对某个子树而言。比如:第二层的节点的当前节点就是根节点。
前序遍历:不管在什么情况下,都先访问当前节点,再访问当前节点的左节点,最后访问当前节点的右节点。
中序遍历:不管在什么情况下,都先访问当前节点的左节点,再访问当前节点,最后访问当前节点的右节点。
后序遍历:不管在什么情况下,都先访问当前节点的左节点,再访问当前节点的右节点,最后访问当前节点。
二叉树的链表描述
节点结构体
将每一个节点,用一个结构体描述。
基础需要:值、左节点、右节点
代码如下
template<class T>
struct binaryTreeNode
{
T element;
binaryTreeNode<T> * leftChild;
binaryTreeNode<T> * rightChild;
binaryTreeNode() { leftChild = rightChild = NULL; }
binaryTreeNode(const T & theElement)
{
element = theElement;
leftChild = rightChild = NULL;
}
//赋值一个节点的时候,顺便赋值左节点、右节点
binaryTreeNode(const T &theElement,binaryTreeNode<T> * theLeftChild,binaryTreeNode<T> * theRightChild)
{
element = theElement;
leftChild = theLeftChild;
rightChild = theRightChild;
}
};
类linkBinaryTree
节点的尺寸:总的节点数。
class linkBinaryTree
{
public:
linkBinaryTree() { root = NULL; treeSize = 0; }
~linkBinaryTree()
{
release(root);
}
void makeTree(T element,linkBinaryTree<T>&left,linkBinaryTree<T>&right);//创建一个节点
void release(binaryTreeNode<T> * bTreeNode_struct);//释放
//先序遍历
void preOrderOutput();
//中序遍历
void inOrderOutput();
//后序遍历
void postOrderOutput();
int getSize()const { return treeSize; }
bool empty() { return treeSize == 0; }
private:
int treeSize;
binaryTreeNode<T> *root;
void preOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
void inOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
void postOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
};
template<class T>
inline void linkBinaryTree<T>::makeTree(T element, linkBinaryTree<T>&left, linkBinaryTree<T>&right)
{
root = new binaryTreeNode<T>(element, left.root, right.root);
treeSize = left.treeSize + right.treeSize + 1;
left.root =right.root= NULL;
left.treeSize = right.treeSize = 0;
}
template<class T>
inline void linkBinaryTree<T>::release(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != nullptr)
{
release(bTreeNode_struct->leftChild);
release(bTreeNode_struct->rightChild);
delete bTreeNode_struct;
}
}
template<class T>
inline void linkBinaryTree<T>::preOrderOutput()
{
preOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::inOrderOutput()
{
inOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::postOrderOutput()
{
postOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::preOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
cout << bTreeNode_struct->element;
preOrderOutput(bTreeNode_struct->leftChild);
preOrderOutput(bTreeNode_struct->rightChild);
}
}
template<class T>
inline void linkBinaryTree<T>::inOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
inOrderOutput(bTreeNode_struct->leftChild);
cout << bTreeNode_struct->element;
inOrderOutput(bTreeNode_struct->rightChild);
}
}
template<class T>
inline void linkBinaryTree<T>::postOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
postOrderOutput(bTreeNode_struct->leftChild);
postOrderOutput(bTreeNode_struct->rightChild);
cout << bTreeNode_struct->element;
}
}
完整的代码以及运行结果
binaryTreeNode.h
#pragma once
template<class T>
struct binaryTreeNode
{
T element;
binaryTreeNode<T> * leftChild;
binaryTreeNode<T> * rightChild;
binaryTreeNode() { leftChild = rightChild = NULL; }
binaryTreeNode(const T & theElement)
{
element = theElement;
leftChild = rightChild = NULL;
}
binaryTreeNode(const T &theElement,binaryTreeNode<T> * theLeftChild,binaryTreeNode<T> * theRightChild)
{
element = theElement;
leftChild = theLeftChild;
rightChild = theRightChild;
}
};
linkBinaryTree.h
#pragma once
#include"binaryTreeNode.h"
#include<iostream>
using namespace std;
template<class T>
class linkBinaryTree
{
public:
linkBinaryTree() { root = NULL; treeSize = 0; }
~linkBinaryTree()
{
release(root);
}
void makeTree(T element,linkBinaryTree<T>&left,linkBinaryTree<T>&right);//创建一个节点
void release(binaryTreeNode<T> * bTreeNode_struct);//释放
void preOrderOutput();
void inOrderOutput();
void postOrderOutput();
int getSize()const { return treeSize; }
bool empty() { return treeSize == 0; }
private:
int treeSize;
binaryTreeNode<T> *root;
void preOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
void inOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
void postOrderOutput(binaryTreeNode<T> * bTreeNode_struct);
};
template<class T>
inline void linkBinaryTree<T>::makeTree(T element, linkBinaryTree<T>&left, linkBinaryTree<T>&right)
{
root = new binaryTreeNode<T>(element, left.root, right.root);
treeSize = left.treeSize + right.treeSize + 1;
left.root =right.root= NULL;
left.treeSize = right.treeSize = 0;
}
template<class T>
inline void linkBinaryTree<T>::release(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != nullptr)
{
release(bTreeNode_struct->leftChild);
release(bTreeNode_struct->rightChild);
delete bTreeNode_struct;
}
}
template<class T>
inline void linkBinaryTree<T>::preOrderOutput()
{
preOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::inOrderOutput()
{
inOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::postOrderOutput()
{
postOrderOutput(root);
}
template<class T>
inline void linkBinaryTree<T>::preOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
cout << bTreeNode_struct->element;
preOrderOutput(bTreeNode_struct->leftChild);
preOrderOutput(bTreeNode_struct->rightChild);
}
}
template<class T>
inline void linkBinaryTree<T>::inOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
inOrderOutput(bTreeNode_struct->leftChild);
cout << bTreeNode_struct->element;
inOrderOutput(bTreeNode_struct->rightChild);
}
}
template<class T>
inline void linkBinaryTree<T>::postOrderOutput(binaryTreeNode<T>* bTreeNode_struct)
{
if (bTreeNode_struct != NULL)
{
postOrderOutput(bTreeNode_struct->leftChild);
postOrderOutput(bTreeNode_struct->rightChild);
cout << bTreeNode_struct->element;
}
}
cpp执行文件
#include"linkBinaryTree.h"
int main()
{
//linkBinaryTree<int> a, b, c;
//b.makeTree(1, a, a);
//b.preOrderOutput();
linkBinaryTree<int> a, x, y, z;
y.makeTree(1, a, a);
z.makeTree(2, a, a);
x.makeTree(3, y, z);
y.makeTree(4, x, a);
cout << "先序遍历:"<<endl;
y.preOrderOutput();
cout << endl << "中序遍历:" << endl;
y.inOrderOutput();
cout << endl << "后序遍历:" << endl;
y.postOrderOutput();
cout << endl;
cout << "大小:";
cout << y.getSize();
return 0;
}