数据结构相关题目(二叉树 C++代码)

1.由二叉树的后序遍历序列和中序遍历序列建立二叉树的二叉链表(设二叉树的元素互异)。

 代码:

#include<iostream>
#include <cstring>
using namespace std;
 
const int MaxTreeSize = 50;
typedef char TElemType;
typedef struct BiTNode
{
 TElemType data;
 BiTNode* lc, * rc;
}*BiTree;
 
typedef struct ANode
{
 BiTree data;
 ANode* next;
}*LQueuePtr;
 
struct LQueue
{
LQueuePtr front, rear;
};
 
void BiTreeLists(BiTree T)
{
if (!T)
{
 cout << '#';
 return;
 }
 printf("%c", T->data);
 if (T->lc || T->rc)
 {
 cout << '(';
 BiTreeLists(T->lc);
 cout << ',';
 BiTreeLists(T->rc);
 cout << ')';
 }
}
 
void CreateBiTree(BiTree& T, char s[], int& i)
{
 i++;
 if (s[i] == '#')
 {
 T = NULL;
 return;
 }
 T = new BiTNode;
 T->data = s[i];
 CreateBiTree(T->lc, s, i);
 CreateBiTree(T->rc, s, i);
}
 
void CreateBiTree(BiTree& T, char s[])
{
 int i = -1;
 CreateBiTree(T, s, i);
}

 
bool create1(BiTree& T,char preorder[],char inorder[],int n)
{
   int i=0;
   if (!n)
   {
       T = NULL;
       return true;
   }
   while (i < n && inorder[i] != preorder[0])
   {
       i++;
   }
   if (i == n)
   {
       T = NULL;
       return false;
   }
   T = new BiTNode;
   T->data = preorder[0];
   return create1(T->lc, preorder + 1, inorder, i) &&create1(T->rc, preorder + i + 1, inorder + i + 1, n - i - 1);
}

bool create2(BiTree& T, char P1[], char P2[])
{
   int a = strlen(P1);
   int b = strlen(P2);
   if (a!=b) return false;
   else
   {
       return create1(T, P1, P2, a);;
   }
}


BiTNode* buildTree(char inorder[], int il, int ir, char postorder[], int pl, int pr) {
        if(pr < pl) return NULL;
        if(pr == pl) {
			BiTree T;
			T = new BiTNode;
            T->data = postorder[pl];
			return T;
		}

        char rootVal = postorder[pr];
        int index = -1;
        for(int i = il; i <= ir; i ++) {
            if(inorder[i] == rootVal) {
                index = i;
                break;
            }
        }
        
	    BiTree root;
	    root = new BiTNode;
	    root->data = rootVal;
        if(index > il) {
            root->lc = buildTree(inorder, il, index - 1, postorder, pl, pl + index - il - 1);
        }
        
        if(index < ir) {
            root->rc = buildTree(inorder, index + 1, ir, postorder, pl + index - il, pr - 1);
        }
        
        return root;
}

BiTNode* create3(char postorder[],char inorder[])
{
   int a = strlen(postorder);
   int b = strlen(inorder);
   if (a!=b) return NULL;
   else
   {
       return buildTree(inorder, 0, b - 1, postorder, 0, a - 1);
   }
}
 



int main()
{
 	BiTree T;
 	char preorder[] = "AEDCB";
	char inorder[] = "DECBA";
	char postorder[] = "DBCEA";
	cout << "由先序遍历和中序遍历建立的二叉树为:" ;
	create2(T, preorder, inorder);
	BiTreeLists(T);
	cout << "\n" ;
	BiTree T1;
	cout << "由后序遍历和中序遍历建立的二叉树为:" ;
	T1 = create3(postorder, inorder);
	BiTreeLists(T1);
	cout << endl;
 	return 0;
}

2.设树的数据元素为字母,由树的广义表字符串建立树的二叉链表。

 代码:

#include<iostream>
#include <cstring>
using namespace std;
 
const int MaxTreeSize = 50;
typedef char TElemType;
typedef struct BiTNode
{
 TElemType data;
 BiTNode* lc, * rc;
}*BiTree;
 
typedef struct ANode
{
 BiTree data;
 ANode* next;
}*LQueuePtr;
 
struct LQueue
{
LQueuePtr front, rear;
};
 
void BiTreeLists(BiTree T)
{
if (!T)
{
 cout << '#';
 return;
 }
 printf("%c", T->data);
 if (T->lc || T->rc)
 {
 cout << '(';
 BiTreeLists(T->lc);
 cout << ',';
 BiTreeLists(T->rc);
 cout << ')';
 }
}
 
void CreateBiTree(BiTree& T, char s[], int& i)
{
 i++;
 if (s[i] == '#')
 {
 T = NULL;
 return;
 }
 T = new BiTNode;
 T->data = s[i];
 CreateBiTree(T->lc, s, i);
 CreateBiTree(T->rc, s, i);
}
 
void CreateBiTree(BiTree& T, char s[])
{
 int i = -1;
 CreateBiTree(T, s, i);
}

 
bool create1(BiTree& T,char preorder[],char inorder[],int n)
{
   int i=0;
   if (!n)
   {
       T = NULL;
       return true;
   }
   while (i < n && inorder[i] != preorder[0])
   {
       i++;
   }
   if (i == n)
   {
       T = NULL;
       return false;
   }
   T = new BiTNode;
   T->data = preorder[0];
   return create1(T->lc, preorder + 1, inorder, i) &&create1(T->rc, preorder + i + 1, inorder + i + 1, n - i - 1);
}

bool create2(BiTree& T, char P1[], char P2[])
{
   int a = strlen(P1);
   int b = strlen(P2);
   if (a!=b) return false;
   else
   {
       return create1(T, P1, P2, a);;
   }
}

 

int NodeCountOne(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if((T->lc!=NULL&&T->rc==NULL) || (T->lc==NULL&&T->rc!=NULL)) cnt++;
    cnt += NodeCountOne(T->lc);
    cnt += NodeCountOne(T->rc);
    return cnt;
}

int NodeCountTow(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if(T->lc!=NULL&&T->rc!=NULL) cnt++;
    cnt+=NodeCountTow(T->lc);
    cnt+=NodeCountTow(T->rc);
    return cnt;
}


int CreateBiTree(BiTree *T,char *str)
{
	BiTree S[MaxTreeSize], p = NULL;
	int top = 0, k = 0, j = 0;
	char ch;
	*T = NULL;
	ch = str[j];
	while (ch!='@')
	{
		switch(ch)
		{
		case '(':
			S[top++] = p;
			k = 1;
			break;
		case ')':
			top--;
			break;
		case ',':
			k = 2;
			break;
 
		default:
			p = (BiTree)malloc(sizeof(BiTNode));
			p->data = ch;
			p->lc = p->rc = NULL;
			if (*T==NULL)
			{
				*T = p;
			} 
			else
			{
				switch (k)
				{
				case 1:
					S[top - 1]->lc = p;
					break;
				case 2:
					S[top - 1]->rc = p;
					break;
				}
			}
			break;
		}
		ch = str[++j];
	}
	return 1;
}
 

int main()
{
 	BiTree T;
	char str[] = "A(B(D),C(F(,E),G))@";
	CreateBiTree(&T,str);
	cout << "由广义表字符串创建的二叉树为:" ;
    BiTreeLists(T);
	cout << endl;
 	return 0;
}

3.打印数的边。

代码:

#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;

// 定义二叉树节点结构体
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

// 输出二叉树边的函数
vector<string> printEdges(TreeNode* root) {
    vector<string> res;
    if (!root) return res;

    // 定义队列存储节点和对应的编号
    queue<pair<TreeNode*, int>> q;
    q.push(make_pair(root, 1));
    int curLevel = 1;
    int curIdx = 1;

    while (!q.empty()) {
        TreeNode* curNode = q.front().first;
        int curNodeIdx = q.front().second;
        q.pop();

        if (curNodeIdx != curIdx) {
            curIdx = curNodeIdx;
            curLevel *= 2;
        }

        if (curNode->left) {
            q.push(make_pair(curNode->left, curNodeIdx * 2));
            res.push_back(to_string(curNodeIdx) + "->" + to_string(curNodeIdx * 2));
        }

        if (curNode->right) {
            q.push(make_pair(curNode->right, curNodeIdx * 2 + 1));
            res.push_back(to_string(curNodeIdx) + "->" + to_string(curNodeIdx * 2 + 1));
        }
    }

    return res;
}

// 测试
int main() {
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->right = new TreeNode(4);
    root->right->left = new TreeNode(5);
    root->right->right = new TreeNode(6);

    vector<string> res = printEdges(root);

    cout << "Edges: ";
    for (string edge : res) {
        cout << edge << " ";
    }
    cout << endl;

    return 0;
}

4.统计度为1的节点数量和度为2的节点数量。

 

代码:

#include<iostream>
#include <cstring>
using namespace std;
 
const int MaxTreeSize = 50;
typedef char TElemType;
typedef struct BiTNode
{
 TElemType data;
 BiTNode* lc, * rc;
}*BiTree;
 
typedef struct ANode
{
 BiTree data;
 ANode* next;
}*LQueuePtr;
 
struct LQueue
{
LQueuePtr front, rear;
};
 
void BiTreeLists(BiTree T)
{
if (!T)
{
 cout << '#';
 return;
 }
 printf("%c", T->data);
 if (T->lc || T->rc)
 {
 cout << '(';
 BiTreeLists(T->lc);
 cout << ',';
 BiTreeLists(T->rc);
 cout << ')';
 }
}
 
void CreateBiTree(BiTree& T, char s[], int& i)
{
 i++;
 if (s[i] == '#')
 {
 T = NULL;
 return;
 }
 T = new BiTNode;
 T->data = s[i];
 CreateBiTree(T->lc, s, i);
 CreateBiTree(T->rc, s, i);
}
 
void CreateBiTree(BiTree& T, char s[])
{
 int i = -1;
 CreateBiTree(T, s, i);
}

 
bool create1(BiTree& T,char preorder[],char inorder[],int n)
{
   int i=0;
   if (!n)
   {
       T = NULL;
       return true;
   }
   while (i < n && inorder[i] != preorder[0])
   {
       i++;
   }
   if (i == n)
   {
       T = NULL;
       return false;
   }
   T = new BiTNode;
   T->data = preorder[0];
   return create1(T->lc, preorder + 1, inorder, i) &&create1(T->rc, preorder + i + 1, inorder + i + 1, n - i - 1);
}

bool create2(BiTree& T, char P1[], char P2[])
{
   int a = strlen(P1);
   int b = strlen(P2);
   if (a!=b) return false;
   else
   {
       return create1(T, P1, P2, a);;
   }
}

 

int NodeCountOne(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if((T->lc!=NULL&&T->rc==NULL) || (T->lc==NULL&&T->rc!=NULL)) cnt++;
    cnt += NodeCountOne(T->lc);
    cnt += NodeCountOne(T->rc);
    return cnt;
}

int NodeCountTow(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if(T->lc!=NULL&&T->rc!=NULL) cnt++;
    cnt+=NodeCountTow(T->lc);
    cnt+=NodeCountTow(T->rc);
    return cnt;
}




int main()
{
 	BiTree T;
 	char preorder[] = "AEDCB";
	char inorder[] = "DECBA";
	char postorder[] = "DBCEA";
	cout << "由先序遍历和中序遍历建立的二叉树为:" ;
	create2(T, preorder, inorder);
	BiTreeLists(T);
	cout << "\n度为1的节点数为" ;
	cout << NodeCountOne(T);
	cout << "\n度为2的节点数为" ;
	cout << NodeCountTow(T);
	cout << endl;
 	return 0;
}

5.由广义字符表创建二叉树。

 

代码:

#include<iostream>
#include <cstring>
using namespace std;
 
const int MaxTreeSize = 50;
typedef char TElemType;
typedef struct BiTNode
{
 TElemType data;
 BiTNode* lc, * rc;
}*BiTree;
 
typedef struct ANode
{
 BiTree data;
 ANode* next;
}*LQueuePtr;
 
struct LQueue
{
LQueuePtr front, rear;
};
 
void BiTreeLists(BiTree T)
{
if (!T)
{
 cout << '#';
 return;
 }
 printf("%c", T->data);
 if (T->lc || T->rc)
 {
 cout << '(';
 BiTreeLists(T->lc);
 cout << ',';
 BiTreeLists(T->rc);
 cout << ')';
 }
}
 
void CreateBiTree(BiTree& T, char s[], int& i)
{
 i++;
 if (s[i] == '#')
 {
 T = NULL;
 return;
 }
 T = new BiTNode;
 T->data = s[i];
 CreateBiTree(T->lc, s, i);
 CreateBiTree(T->rc, s, i);
}
 
void CreateBiTree(BiTree& T, char s[])
{
 int i = -1;
 CreateBiTree(T, s, i);
}

 
bool create1(BiTree& T,char preorder[],char inorder[],int n)
{
   int i=0;
   if (!n)
   {
       T = NULL;
       return true;
   }
   while (i < n && inorder[i] != preorder[0])
   {
       i++;
   }
   if (i == n)
   {
       T = NULL;
       return false;
   }
   T = new BiTNode;
   T->data = preorder[0];
   return create1(T->lc, preorder + 1, inorder, i) &&create1(T->rc, preorder + i + 1, inorder + i + 1, n - i - 1);
}

bool create2(BiTree& T, char P1[], char P2[])
{
   int a = strlen(P1);
   int b = strlen(P2);
   if (a!=b) return false;
   else
   {
       return create1(T, P1, P2, a);;
   }
}

 

int NodeCountOne(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if((T->lc!=NULL&&T->rc==NULL) || (T->lc==NULL&&T->rc!=NULL)) cnt++;
    cnt += NodeCountOne(T->lc);
    cnt += NodeCountOne(T->rc);
    return cnt;
}

int NodeCountTow(BiTree T)
{
    if(!T) return 0;
    int cnt = 0;
    if(T->lc!=NULL&&T->rc!=NULL) cnt++;
    cnt+=NodeCountTow(T->lc);
    cnt+=NodeCountTow(T->rc);
    return cnt;
}


int CreateBiTree(BiTree *T,char *str)
{
	BiTree S[MaxTreeSize], p = NULL;
	int top = 0, k = 0, j = 0;
	char ch;
	*T = NULL;
	ch = str[j];
	while (ch!='@')
	{
		switch(ch)
		{
		case '(':
			S[top++] = p;
			k = 1;
			break;
		case ')':
			top--;
			break;
		case ',':
			k = 2;
			break;
 
		default:
			p = (BiTree)malloc(sizeof(BiTNode));
			p->data = ch;
			p->lc = p->rc = NULL;
			if (*T==NULL)
			{
				*T = p;
			} 
			else
			{
				switch (k)
				{
				case 1:
					S[top - 1]->lc = p;
					break;
				case 2:
					S[top - 1]->rc = p;
					break;
				}
			}
			break;
		}
		ch = str[++j];
	}
	return 1;
}
 



int main()
{
 	BiTree T;
	char str[] = "A(B(D),C(F(,E),G))@";
	CreateBiTree(&T,str);
	cout << "由广义表字符串创建的二叉树为:" ;
    BiTreeLists(T);
	cout << endl;
 	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue200403

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值