算法导论15.5-1的答案及C++实现

①设计的伪代码CONSTRUCT-OPTIMAL-BST(root)如下


CONSTRUCT-OPTIMAL-BST(root,i,j,flag)
    if i<=j
        if flag == 1
            print k root[i,j]为根
        elseif flag == 0 
            print k root[i,j]为k j+1 的左孩子
        else
            print k root[i,j]为k i-1 的右孩子
        CONSTRUCT-OPTIMAL-BST(root,i,root[i,j]-1,0)
        CONSTRUCT-OPTIMAL-BST(root,root[i,j]+1,j,2)
    elseif j=i-1
        if flag == 0
            print d j 为k i+1的左孩子
        elseif flag == 2
            print d j 为k i-1的右孩子
②C++实现:
#include<iostream>
using namespace std;
int root[6][6] = { 
	0, 0, 0, 0, 0, 0,
	0, 1, 1, 2, 2, 2,
	0, 0, 2, 2, 2, 4,
	0, 0, 0, 3, 4, 5,
	0, 0, 0, 0, 4, 5,
	0, 0, 0, 0, 0, 5,
};

void CONSTRUCT_OPTIMAL_BST(int i, int j, int flag){
	if (i <= j){
		if (flag == 1){
			cout << "k" << root[i][j] << "为根" << endl;
		}
		else if (flag == 0){
			cout << "k" << root[i][j] << "为k" << j + 1 << "的左孩子" << endl;
		}
		else{
			cout << "k" << root[i][j] << "为k" << i - 1 << "的右孩子" << endl;
		}
		CONSTRUCT_OPTIMAL_BST(i, root[i][j] - 1, 0);
		CONSTRUCT_OPTIMAL_BST(root[i][j] + 1, j, 2);
	}
	else if (j == (i - 1)){
		if (flag == 0){
			cout << "d" << j << "为k" << j + 1 << "的左孩子" << endl;
		}
		else if (flag == 2){
			cout << "d" << j << "为k" << i - 1 << "的右孩子" << endl;
		}
	}
}

void main()
{
	CONSTRUCT_OPTIMAL_BST(1, 5, 1);
}
输出结果为



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值