二叉树实现

#编程作业,浅浅记录一下:

头文件:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include<stdio.h> 
#include<stack>
using namespace std;
typedef struct lnode {
	char c;
	lnode* left;
	lnode* right;
}lnode, * zhi;
stack<zhi> z;
int n = 0;
访问二叉树:

包括前,中,后递归遍历,中序栈遍历,以及叶子节点的数量和树的深度。

bool visit(char t) {
	cout << t;
	return true;
}
bool preorder(lnode* T) {
	if (T) {
		if (visit(T->c)) {
			if (preorder(T->left))
				if (preorder(T->right))return 1;
			return 0;
		}
	}
	else return 1;
}
bool inorder(lnode* T) {
	if (T) {
		if (inorder(T->left)) {
			if (visit(T->c))
				if (inorder(T->right))return 1;
		}
	}
	else return 1;
}
bool lastorder(lnode* T) {
	if (T) {
		if (lastorder(T->left)) {
			if (lastorder(T->right))
				if (visit(T->c))return 1;
		}
	}
	else return 1;
}
bool ino(lnode* T) {
	z.push(T);
	lnode* p;
	while (!z.empty()) {
		while ((p = z.top()) && p)z.push(p->left);
		z.pop();
		if (!z.empty())
		{
			p = z.top();
			z.pop();
			if (!visit(p->c))return 0;
			z.push(p->right);
		}

	}
	return 1;

}
int getdepth(lnode* T) {
	int llength, rlength, mlength;
	if (T != NULL) {
		llength = getdepth(T->left);
		rlength = getdepth(T->right);
		mlength = llength > rlength ? llength : rlength;
		return mlength + 1;
	}
	else
	{
		return 0;
	}
}
int getleaves(lnode* T) {
	int lleaves, rleaves;
	//if (T->left == NULL && T->right == NULL)return 1;
	if (T != NULL && T->left == NULL && T->right == NULL) {
		return 1;
	}
	else
	{
		if (T != NULL) {
			lleaves = getleaves(T->left);
			rleaves = getleaves(T->right);
			return lleaves + rleaves;
		}
		else return 0;
	}
}
由先序式子构建二叉树:

例如:

输入:

AB#C##D##

输出:(先序,中序,后序)

-+ab/de
a+b-d/e
ab+de/-

构建二叉树:

void creat(lnode** T) {//指向指针的地址,即用T的值(*T)是(lnode*)指针的地址
	char ch;
	scanf("%c", &ch);
	if (ch == '#')*T = NULL;
	else {
		if (!(*T = (lnode*)malloc(sizeof(lnode)))) {

		}
		(*T)->c = ch;
		creat(&(*T)->left);
		creat(&(*T)->right);
	}

}//先序递归创建

由先缀表达式构建二叉树:

输入:

-+ab/de

输出:

-+ab/de
a+b-d/e
ab+de/-

构建二叉树:

 在前面的基础上稍加修改。

void creat2(lnode** T) {//前缀表达式指向指针的地址,
	char ch;
	scanf("%c", &ch);
	if (ch <= 122 && ch >= 97) {
		if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
			//exit(OVERFLOW);
		}
		(*T)->c = ch;
		(*T)->left = NULL;
		(*T)->right = NULL;
	}
	else {
		if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
			exit(OVERFLOW);
		}
		(*T)->c = ch;
		creat2(&(*T)->left);
		creat2(&(*T)->right);
	}


}

由中缀表达式构建二叉树:

思路先将中缀表达式换为前缀表达式。

换为前缀表示:

typedef struct lnode {
	char c;
	lnode* left;
	lnode* right;
}lnode, * zhi;
stack<string>z;
int index=0;//
string prefix;
int isOperator(char ch) {
    //cout << ch << endl;
    return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}

int getPriority(char ch) {
    if (ch == '-' || ch == '+')
        return 1;
    else if (ch == '*' || ch == '/')
        return 2;
    else
        return 0;//'('')';
}

string infixToPrefix(string infix) {
    //string prefix;
    int infixLen = infix.length();//长度
    //int prefixIndex = 0;
    for (int i = infixLen - 1; i >= 0; i--) {
        if (infix[i] == ' ')
            continue;
        if (isOperator(infix[i])) {
            while (!z.empty() && getPriority(z.top()[0]) > getPriority(infix[i])) {
                string temp = z.top();
               // cout << "+++++";
               // cout << temp;
                z.pop();
                prefix+= temp;
            }
            string s(1, infix[i]);
         //   cout << s << endl;
            z.push(s);
        }
        else if (infix[i] == ')') {
            string s(1, infix[i]);
            z.push(s);
        }
        else if (infix[i] == '(') {
            while (!z.empty() && z.top() != ")") {
                string temp = z.top();
                z.pop();
                prefix += temp;
            }
            z.pop(); // 弹出 ')'
        }
        else {
            string s(1, infix[i]);
            prefix += s;
        }
    }

    while (!z.empty()) {
        string temp = z.top();
        z.pop();
        prefix += temp;
    }

    //prefix[prefixIndex] = '\0';
    reverse(prefix.begin(), prefix.end());
    return prefix;
}

再根据前缀式构建:

void creat2(lnode** T) {//前缀表达式指向指针的地址,
    //cout << index << endl;
    //if (index < prefix.length())cout << prefix[index++] << endl;
    char ch;
    if (index < prefix.length())ch = prefix[index++];
    else ch=' ';
    //cout << ch << endl;
    if ((ch <= 122 && ch >= 97)||(ch<=90&&ch>=65)) {//小写要考虑进去
        if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
            //exit(OVERFLOW);
        }
        (*T)->c = ch;
        (*T)->left = NULL;
        (*T)->right = NULL;
    }
    else {
        if (!(*T = (lnode*)malloc(sizeof(lnode)))) {
            //exit(OVERFLOW);
        }
        (*T)->c = ch;
        creat2(&(*T)->left);
        creat2(&(*T)->right);
    }


}

根据先序遍历和中序遍历构建二叉树:

 用的递归的思想:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include<stdio.h> 
using namespace std;
string s1;
string s2;
typedef struct tnode {
	char data;
	tnode* left;
	tnode* right;
}tnode;
void creat(tnode* &T,int Xi,int Xj,int Zi,int Zj) {
	//if (T == NULL)
	//{
	if (Xi > Xj) {
		T = NULL;
		return;
	}
	T = (tnode*)malloc(sizeof(tnode));
	T->data = s1[Xi];
	int k = 0;
	
	//if (s2.find(T->data, Zi) != s2.npos) {
		//k = s2.find(T->data, Zi);

	//}
	for (int i = Zi; i < Zj + 1; i++)
	{
		if (s1[Xi] == s2[i])
		{
			k = i;
			break;
		}
	}
	creat(T->left,Xi+1,Xi+k-Zi,Zi,k-1);
	creat(T->right, Xi + k - Zi + 1, Xj, k + 1, Zj);
}
int main() {
	cin >> s1 >> s2;
	int Xi = 0, Zi = 0, Xj = s1.length() - 1, Zj = s2.length() - 1;
	tnode* boot = NULL;
	creat(boot, Xi, Xj, Zi, Zj);
	cout << getdepth(boot) << endl;
	cout << getleaves(boot) ;
}
构建线索二叉树:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值