0 二叉树与表达式
代码
#include <iostream>
#include <stdio.h>
#include "cstdio"
#include <cmath>
using namespace std;
class Tree;
class TreeNode
{
friend class Tree;
private:
char data;
TreeNode *left;
TreeNode *right;
public:
TreeNode() : left(NULL), right(NULL){};
TreeNode(char data1) : data(data1), left(NULL), right(NULL) {}
};
class Tree
{
private:
TreeNode *root;
char endtag;
void Create(TreeNode *&subtree); //指针的引用
void destroy(TreeNode *&subtree); // 指针的引用
void inorder(TreeNode *subtree);
int operator1(TreeNode *subtree);
TreeNode *parent(TreeNode *subtree, TreeNode *cur);
void in_test(TreeNode *subtree);
public:
Tree() { root = NULL; }
Tree(char end1, TreeNode *p = NULL) : root(p), endtag(end1) {}
~Tree() { destroy(root); }
bool isEmpty() { return root == NULL ? true : false; }
void Create() { Create(root); }
void inorder() { inorder(root); }
int operator1() { return operator1(root); }
bool see(char op1, char oop2);
TreeNode *parent(TreeNode *cur)
{
return (root == NULL || root == cur) ? NULL : parent(root, cur);
}
void in_test() { in_test(root); }
};
void Tree::in_test(TreeNode *subtree)
{
if (!subtree)
{
in_test(subtree->left);
if (subtree->data == 'D')
{
cout << parent(subtree)->data << endl;
}
in_test(subtree->right);
}
}
TreeNode *Tree::parent(TreeNode *subtree, TreeNode *cur)
{
if (subtree == NULL)
{
return NULL;
}
if (subtree->left == cur || subtree->right == cur)
{
return subtree;
}
return parent(subtree->left, cur) == NULL ? parent(subtree->right, cur) : parent(subtree->left, cur);
}
void Tree::Create(TreeNode *&subtree)
{
char item;
cin >> item;
if (item != endtag)
{
subtree = new TreeNode(item);
Create(subtree->left);
Create(subtree->right);
}
}
void Tree::destroy(TreeNode *&subtree)
{
if (subtree != NULL)
{
destroy(subtree->left);
destroy(subtree->right);
delete subtree;
}
}
void Tree::inorder(TreeNode *subtree)
{
if (subtree != NULL)
{
if (subtree->right != NULL && see(subtree->data, subtree->right->data))
{
inorder(subtree->left);
cout << subtree->data;
cout << "(";
inorder(subtree->right);
cout << ')';
}
else
{
inorder(subtree->left);
cout << subtree->data;
inorder(subtree->right);
}
}
}
int Tree::operator1(TreeNode *subtree)
{
if (subtree != NULL)
{
switch (subtree->data)
{
case '+':
return operator1(subtree->left) + operator1(subtree->right);
break;
case '-':
return operator1(subtree->left) - operator1(subtree->right);
break;
case '*':
return operator1(subtree->left) * operator1(subtree->right);
break;
case '/':
return operator1(subtree->left) / operator1(subtree->right);
break;
default:
return int(subtree->data - '0');
break;
}
}
else
return 0;
}
bool Tree::see(char op1, char op2)
{
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-'))
return true;
else
return false;
}
int main()
{
// Tree tree('#');
// tree.Create();
// tree.in_test();
Tree tree1('@');
tree1.Create();
tree1.inorder();
cout << "=" << tree1.operator1() << endl;
// Tree tree2('@');
// tree2.Create();
// tree2.inorder();
// cout << "=" << tree2.operator1() << endl;
return 0;
}
1. 二叉树的基本操作:题目描述
代码1(面向过程)
#include "iostream"
#include "cstdio"
#include "cstdlib"
#include "string"
#include "cstring"
#include "cmath"
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char Elemtype;
typedef int Status;
typedef struct BiTNode
{
Elemtype data;
int depth; /* 每个node的depth */
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
string tree_str;
int index_ = 0;
int Tree_depth = 0;
int num_nodes = 0;
int num_leaves = 0;
int find_A_cnt = 0;
Status InitBiTree(BiTree *T);
//void CreateBiTree(BiTree *T);
int TreeDeep(BiTree T);
int GetHeight(BiTree root);
void PreOrderTraverse(BiTree T);
void InOrderTraverse(BiTree root);
void PostOrderTraverse(BiTree T);
int CntFind(BiTree T, int find_e, int ini_);
void DestoryBiTree(BiTree *T);
BiTNode *BTreeFind(BiTNode *root, char x);
struct BiTNode *build();
void getDepth(BiTree p, int depth_);
void Print_Tab_BiTree(BiTree T);
void num_nodes_fun(BiTree T);
void num_leaves_fun(BiTree T);
void find_cnt(BiTree T, Elemtype e);
int main()
{
//freopen("in.txt","r",stdin);
char c;
cin>>c;
cout<<"Created success!"<<endl;
BiTree head;
InitBiTree(&head);
cin>>tree_str;
head = build();
getDepth(head, 0); /* 深度从0开始数 */
while(cin>>c)
{
if(c =='H')
cout<<"Height="<<Tree_depth+1<<"."<<endl;
else if(c == 'L')
{
num_leaves_fun(head);
cout<<"Leaf="<<num_leaves<<"."<<endl;
}
else if(c == 'N')
{
num_nodes_fun(head);
cout<<"Nodes="<<num_nodes<<"."<<endl;
}
else if(c == '1')
{
cout<<"Preorder is:";
PreOrderTraverse(head);
cout<<"."<<endl;
}
else if(c == '2')
{
cout<<"Inorder is:";
InOrderTraverse(head);
cout<<"."<<endl;
}
else if(c == '3')
{
cout<<"Postorder is:";
PostOrderTraverse(head);
cout<<"."<<endl;
}
else if(c == 'F')
{
cout<<"The count of A is ";
find_cnt(head, c);
cout<<find_A_cnt<<"."<<endl;
}
else if(c == 'P')
{
cout<<"The tree is:"<<endl;
Print_Tab_BiTree(head);
}
}
DestoryBiTree(&head);
return 0;
}
Status InitBiTree(BiTree *T)
{
*T = NULL;
return OK;
}
//void CreateBiTree(BiTree *T)
//{
// Elemtype ch;
// //scanf("%c", &ch);
//
// ch = tree_str[index_++];
// if (ch == '#')
// *T = NULL;
// else
// {
// *T = (BiTree)malloc(sizeof(BiTNode));
// if (!*T)
// {
// exit(_OVERFLOW);
// }
// (*T)->data = ch; /* 生成根节点 */
// CreateBiTree(&(*T)->lchild);
// CreateBiTree(&(*T)->rchild);
// }
//}
int TreeDeep(BiTree T)
{
int deep = 0;
if (T != NULL)
{
int LeftDeep = TreeDeep(T->lchild);
int RightDeep = TreeDeep(T->rchild);
deep = LeftDeep >= RightDeep ? LeftDeep + 1 : RightDeep + 1;
}
return deep;
}
/* invalid function */
int GetHeight(BiTree root)
{
if (root == NULL)
{
return 0;
}
int CntLeft = GetHeight(root->lchild);
int CntRight = GetHeight(root->rchild);
return CntLeft > CntRight ? CntLeft : CntRight;
}
void PreOrderTraverse(BiTree T)
{
if (T == NULL)
{
return;
}
printf("%c ", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree root)
{
if (root == NULL)
{
return;
}
InOrderTraverse(root->lchild);
printf("%c ", root->data);
InOrderTraverse(root->rchild);
}
void PostOrderTraverse(BiTree T)
{
if (T == NULL)
{
return;
}
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ", T->data);
}
void DestoryBiTree(BiTree *T)
{
if (*T)
{
if ((*T)->lchild) /* 有左孩子 */
{
DestoryBiTree(&(*T)->lchild);
}
if ((*T)->rchild)
{
DestoryBiTree(&(*T)->rchild);
}
free(*T); /* 释放根结点 */
*T = NULL; /* 空指针赋值0 */
}
}
BiTNode *BTreeFind(BiTNode *root, char x)
{
BiTNode *ret = NULL;
if (root == NULL)
{
return root;
}
if (root->data == x)
{
return root;
}
else
{
ret = BTreeFind(root->lchild, x);
if(ret != NULL)
{
if (ret->data == x)
{
return ret;
}
}
ret = BTreeFind(root->rchild, x);
}
return ret;
}
struct BiTNode *build()
{
char ch;
ch = tree_str[index_++];
if(ch == '#')
return NULL;
BiTree p = (BiTree)malloc(sizeof(struct BiTNode));
p->data = ch;
p->lchild = build();
p->rchild = build();
return p;
};
void getDepth(BiTree p, int depth_)
{
if(!p)
return;
p->depth = depth_;
if(p->lchild == NULL && p->rchild == NULL)
Tree_depth = max(Tree_depth, p->depth);
getDepth(p->lchild, depth_+1);
getDepth(p->rchild, depth_+1);
}
void Print_Tab_BiTree(BiTree T)
{
if(T == NULL)
return;
while(T->depth--)
cout<<" ";
cout<<T->data<<endl;
Print_Tab_BiTree(T->lchild);
Print_Tab_BiTree(T->rchild);
}
void num_nodes_fun(BiTree T)
{
if(T == NULL)
return;
num_nodes++;
num_nodes_fun(T->lchild);
num_nodes_fun(T->rchild);
}
void num_leaves_fun(BiTree T)
{
if(T == NULL)
return;
if(T->lchild == NULL && T->rchild == NULL)
num_leaves++;
num_leaves_fun(T->lchild);
num_leaves_fun(T->rchild);
}
void find_cnt(BiTree T, Elemtype e)
{
if(T == NULL)
return;
if(T->data == e)
find_A_cnt++;
find_cnt(T->lchild, e);
find_cnt(T->rchild, e);
}
代码2 (OO)
#include <iostream>
using namespace std;
class BinaryTree;
class BinTreeNode {
friend BinaryTree;
private:
BinTreeNode * leftChild, *rightChild;
char data;
public:
BinTreeNode() {
leftChild = NULL;
rightChild = NULL;
}
BinTreeNode(char x,BinTreeNode *left=NULL,BinTreeNode *right=NULL) {
data = x;
leftChild = left;
rightChild = right;
}
~BinTreeNode() {}
};
class BinaryTree {
private:
BinTreeNode * root;
char endtag;
int cnt = 0;
void createBinTree(BinTreeNode* &subTree);
BinTreeNode *parent(BinTreeNode *subTree, BinTreeNode *current);
int height(BinTreeNode *subTree);
int size(BinTreeNode *subTree);
int leaf(BinTreeNode *subTree);
void destroy(BinTreeNode *&subTree);
void preOrder(BinTreeNode *subTree);
void inOrder(BinTreeNode *subTree);
void postOrder(BinTreeNode *subTree);
void find(BinTreeNode *subTree, char x);
void show(BinTreeNode *subTree,int cnt);
void tes(BinTreeNode *t, int cnt); //For testing
public:
int cn = 0;
BinaryTree(char value) {
endtag = value;
root = NULL;
}
~BinaryTree() {
destroy(root); //why must destroy;
}
void createBinTree() {
createBinTree(root);
}
bool IsEmpty(){
return(root == NULL) ? true : false;
}
BinTreeNode *parent(BinTreeNode *current) {
return(root == NULL || root == current) ? NULL : parent(root, current); //parent wahts the
}
BinTreeNode *leftChild(BinTreeNode *current) {
return(current != NULL) ? current->leftChild : NULL;
}
BinTreeNode *rightChild(BinTreeNode *current) {
return(current != NULL) ? current->rightChild : NULL;
}
int height() {
return height(root);
}
int size() {
return size(root);
}
int leaf() {
return leaf(root);
}
void preOrder() {
preOrder(root);
}
void inOrder() {
inOrder(root);
}
void postOrder() {
postOrder(root);
}
void find(char x) {
find(root, x);
}
void show(int &cnt) {
show(root,cnt);
}
void tes(int &cnt)
{
tes(root, cnt);
}
};
void BinaryTree::createBinTree(BinTreeNode *& subTree)
{
char item;
cin >> item;
if (item != endtag) {
subTree = new BinTreeNode(item);
createBinTree(subTree->leftChild);
createBinTree(subTree->rightChild);
}
else subTree = NULL; //this line can be remove;
}
BinTreeNode * BinaryTree::parent(BinTreeNode * subTree, BinTreeNode * current)
{
if (subTree == NULL)
return NULL;
if (subTree->leftChild == current || subTree->rightChild == current)
return subTree; // what the reason
BinTreeNode *p = parent(subTree->leftChild, current);
if (p != NULL)
return p;
else
return (parent(subTree->rightChild, current));
}
int BinaryTree::height(BinTreeNode * subTree)
{
if (subTree == NULL)
return 0;
else if (height(subTree->leftChild) > height(subTree->rightChild))
return 1 + height(subTree->leftChild);
else
return 1 + height(subTree->rightChild);
}
int BinaryTree::size(BinTreeNode * subTree)
{
if (subTree == NULL) {
return 0;
}
else {
return 1 + size(subTree->leftChild) + size(subTree->rightChild);
}
}
int BinaryTree::leaf(BinTreeNode * subTree)//need to be rewrite
{
if (subTree != NULL) {
if (subTree->leftChild == NULL && subTree->rightChild == NULL)
{
cnt++;
}
leaf(subTree->leftChild);
leaf(subTree->rightChild);
}
return cnt;
}
void BinaryTree::destroy(BinTreeNode *& subTree)
{
if (subTree != NULL) {
destroy(subTree->leftChild);
destroy(subTree->rightChild);
delete subTree;
}
}
void BinaryTree::preOrder(BinTreeNode * subTree)
{
if (subTree != NULL) {
cout << subTree->data<<" ";
preOrder(subTree->leftChild);
preOrder(subTree->rightChild);
}
}
void BinaryTree::inOrder(BinTreeNode * subTree)
{
if (subTree != NULL) {
inOrder(subTree->leftChild);
cout << subTree->data << " ";
inOrder(subTree->rightChild);
}
}
void BinaryTree::postOrder(BinTreeNode * subTree)
{
if (subTree != NULL) {
postOrder(subTree->leftChild);
postOrder(subTree->rightChild);
cout << subTree->data << " ";
}
}
void BinaryTree::find(BinTreeNode * subTree, char x)
{
if (subTree != NULL) {
find(subTree->leftChild,x);
find(subTree->rightChild,x);
if (subTree->data == x) {
cn++;
}
}
}
void BinaryTree::show(BinTreeNode * subTree,int cnt)
{
if (subTree != NULL) {
for (int i = 0; i < cnt; i++) {
cout << " ";
}
cout << subTree->data<<endl;
show(subTree->leftChild, cnt+1);
show(subTree->rightChild, cnt+1);
}
}
void BinaryTree::tes(BinTreeNode *t, int cnt)
{
if(t)
{
for(int i=0;i<cnt;i++)
{
cout<<'\t';
}
cout<<cnt<<t->data<<endl;
tes(t->leftChild, cnt+1);
tes(t->rightChild, cnt+1);
}
}
int main()
{
BinaryTree b('#');
// char c;
// while (cin >> c) {
// if (c == 'C') {
// b.createBinTree();
// if (b.IsEmpty() != true) {
// cout << "Created success!" << endl;
// }
// }
// else if (c == 'H') {
// cout << "Height=" << b.height() << "." << endl;
// }
// else if (c == 'L') {
// cout << "Leaf=" << b.leaf() << "." << endl;
// }
//
// else if (c == '1') {
// cout << "Preorder is:";
// b.preOrder();
// cout << "." << endl;
// }
// else if (c == 'N') {
// cout << "Nodes=" << b.size() << "." << endl;
// }
//
// else if (c == '2') {
// cout << "Inorder is:";
// b.inOrder();
// cout << "." << endl;
// }
//
// else if (c == '3') {
// cout << "Postorder is:";
// b.postOrder();
// cout << "." << endl;
// }
// else if (c == 'F') {
// char x;
// cin >> x;
// b.find(x);
// cout << "The count of " << x << " is " << b.cn << "." << endl;
// }
// else if (c == 'P') {
// cout << "The tree is:" << endl;
// int cnt = 0;
// b.show(cnt);
// }
// }
//
b.createBinTree();
int cnt=1;
b.tes(cnt);
return 0;
}
2. 前缀编码
例子