二叉树

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. 前缀编码

例子

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值