C++笔试题深度分析 第五波 下

2. 写一个函数,打印二叉树中某层的所有结点。
二叉树结点定义:
struct Node
{
int v;
Node* left;
Node* right;
};
函数原型:
void print_node_at_level(Node* node, int level)
说明:
将 level 层的结点中所保存的值打印在同一行。

#include <iostream>

using namespace std;

struct Node

{
	int v;
	Node* left;
	Node * right;
};

void print_node_at_level(Node * node, int level)
{
	if(node != NULL)
	{
		if(level == 0)
		{
			cout<<node->v<<" ";
		}
		else
		{
			print_node_at_level(node->left,level -1);
			print_node_at_level(node->right,level -1);
		}
	}
}

int main()
{
	
	
	Node nodes[] =
    {
        {0, NULL, NULL},
        {1, NULL, NULL},
        {2, NULL, NULL},
        {3, NULL, NULL},
        {4, NULL, NULL},
        {5, NULL, NULL},
        {6, NULL, NULL},
        {7, NULL, NULL},
    };
    
    nodes[0].left  = &nodes[1];
    nodes[0].right = &nodes[2];
    nodes[1].left  = &nodes[3];
    nodes[1].right = &nodes[4];
    nodes[2].left  = &nodes[5];
    nodes[2].right = NULL;
    nodes[4].left  = &nodes[6];
    nodes[4].right = &nodes[7];
    
    print_node_at_level(nodes, 3);
    
    cout<<endl;
}


3. 编写一个函数用于删除二叉树中的度数为 1 的所有结点。
要求:
结点删除后其唯一的子结点替代它的位置。

#include <iostream>

using namespace std;

struct Node
{
    int v;
    Node* left;
    Node* right;
};

void print_div(int p)
{
    for(int i=0; i<p; i++)
    {
        cout<<"-";
    }
}

void print_tree(Node* node, int p)
{
    if( node != NULL )
    {
        print_div(p);
        
        cout<<node->v<<endl;
        
        if( (node->left != NULL) || (node->right != NULL) )
        {
            print_tree(node->left, p+1);
            print_tree(node->right, p+1);
        }
    }
    else
    {
        print_div(p);
        
        cout<<endl;
    }
}

void print_tree(Node* node)
{
    print_tree(node, 0);
}

void delete_one_degree_node(Node*& node)
{
    if( node != NULL )
    {
        if( (node->left != NULL) && (node->right != NULL) )
        {
            delete_one_degree_node(node->left);
            delete_one_degree_node(node->right);
        }
        else if( (node->left != NULL) && (node->right == NULL) )
        {
            node = node->left;
            
            delete_one_degree_node(node);
        }
        else if( (node->left == NULL) && (node->right != NULL) )
        {
            node = node->right;
            
            delete_one_degree_node(node);
        }
    }
}

int main()
{
	Node n[10] = {0};
	Node* tree = n;
	
	for(int i=0; i<10; i++)
	{
	    n[i].v = i;
	}
	
	tree[0].left = &tree[1];
	tree[0].right = &tree[2];
	tree[1].left = &tree[3];
	tree[1].right = &tree[4];
	tree[2].left = NULL;
	tree[2].right = &tree[6];
	tree[3].left = &tree[7];
	tree[3].right = &tree[8];
	tree[4].left = &tree[9];
	
	cout<<"Original:"<<endl;
	
	print_tree(tree);
	
	delete_one_degree_node(tree);
	
	cout<<"After:"<<endl;
	
	print_tree(tree);

    return 0;
}


 

4. 输入一个数组,数组里面可能有正数也有负数。数组中一个或连续的多个元素组成一个
子数组。求所有子数组的和的最大值。
要求:
时间复杂度为 O(n)。

 

解释:当前面的数字的和比后面的数字还小,就忽略前面的数字和

template<typename T>
bool max_sub_array_sum(T array[], int len, T& max_sum)
{
    int ret = (len > 0) && (array != NULL);
    
    if( ret )
    {
        T sum = array[0];
        T cur = array[0];
        
        for(int i=1; i<len; i++)
        {
            cur = cur + array[i];
            
            if( cur < array[i] )
            {
                cur = array[i];
            }
            
            if( cur > sum )
            {
                sum = cur;
            }
        }
        
        max_sum = sum;
    }
    
    return ret;
}


5. 在一个整型数组中只可能有 0,1,2 三种数字重复出现,编写一个函数对这样的数组进行
排序。

void three_element_sort(int array[], int len)
{
    int* ts = new int[len];
    int p = 0;
    
    if( ts != NULL )
    {
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<len; j++)
            {
                if( array[j] == i )
                {
                    ts[p++] = i;
                }
            }
        }
        
        for(int i=0; i<len; i++)
        {
            array[i] = ts[i];
        }
        
        delete[]ts;
    }
}

void three_element_sort_ex(int array[], int len)
{
    int p0 = 0;
    int p2 = len - 1;
    
    while( array[p0] == 0 ) p0++;
    while( array[p2] == 2 ) p2--;
    
    for(int i=p0; i<=p2;)
    {
        if( array[i] == 0 )
        {
            swap(array[i], array[p0++]);
            
            while( array[p0] == 0 ) p0++;
            
            if( i < p0 ) i = p0;
        }
        else if( array[i] == 2 )
        {
            swap(array[i], array[p2--]);
            
            while( array[p2] == 2 ) p2--;
        }
        else
        {
            i++;
        }
    }
}


 

6. 求 1+2+3+…n 的和。
要求:
不能使用 if, while, for, switch, ?: 等条件语句,不能使用==, !=, <, <=, >, >=等比较运
算符,也不能调用外部库函数。只能使用加减法操作符,不能使用乘除法操作符。

#include <iostream>

using namespace std;

class Sum
{
private:
    static int N;
    static int S;
    Sum();
public:
    static int Calculate(int n);
};

int Sum::N = 0;
int Sum::S = 0;

Sum::Sum()
{
    S = S + N;
    N = N - 1;
}

int Sum::Calculate(int n)
{
    int ret = 0;
    Sum* p = NULL;
        
    N = n;
    S = 0; 
    p = new Sum[N]; 
    ret = S;
        
    delete[]p;
    
    return ret;
}

int main()
{
    cout<<Sum::Calculate(10)<<endl;
    cout<<Sum::Calculate(100)<<endl;
    
	return 0;
}


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值