笔试题:在二叉树中找出和为某一值的所有路径

题目:输入一个整数和一棵二叉树。

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。

例如输入整数22 和如下二叉树

 10

 /   \

5   12

/ \

4 7

则打印出两条路径:10, 12 和10, 5, 7。


题目:题目要求找到所有的路径,而不是某一条路径,显然需要用递归函数来写。总结july大神的算法,我们可以设置一个变量sum作为遍历时候的剩余路径长度,比如我们遍历到节点10,那么剩余路径长度为22 - 10 = 12,节点5的sum= 22 - 10 - 5 = 7,所以我们可以用sum是否等于0来判断当前路径长度是否与给定值22相等。比如节点7的sum = 0,所以路径10,5,7是符合要求的。当遍历到了符合要求的叶子节点的时候,这个时候需要打印路径,所以很显然我们需要一个数组path来记录路径,另外还需要一个参数top来记录当前节点路径的深度。


代码如下

#define MAX_HEIGHT 20

// 二叉树节点
struct binaryTreeNode
{
    int data;
    struct binaryTreeNode *lChild;
    struct binaryTreeNode *rChild;
};

// 创建一个前面所示的二叉树
void CreateBinaryTree( binaryTreeNode **BTree )
{
    binaryTreeNode *tempNode= NULL, *rootNode= NULL;

    rootNode = (binaryTreeNode*)malloc( sizeof(binaryTreeNode) );
    rootNode->data= 10;

    tempNode = (binaryTreeNode*)malloc( sizeof(binaryTreeNode) );
    tempNode->data= 5;
    rootNode->lChild = tempNode;

    tempNode = (binaryTreeNode*)malloc( sizeof(binaryTreeNode) );
    tempNode->data= 12;
    rootNode->rChild = tempNode;
    tempNode->rChild = NULL;
    tempNode->lChild = NULL;

    tempNode = (binaryTreeNode*)malloc( sizeof(binaryTreeNode) );
    tempNode->data= 4;
    rootNode->lChild->lChild = tempNode;
    tempNode->rChild = NULL;
    tempNode->lChild = NULL;

    tempNode = (binaryTreeNode*)malloc( sizeof(binaryTreeNode) );
    tempNode->data= 7;
    rootNode->lChild->rChild = tempNode;
    tempNode->rChild = NULL;
    tempNode->lChild = NULL;

    *BTree = rootNode;
}

// 打印路径函数
void printPath(int *path, int index)
{
    for (int ii = 0; ii < index; ++ii)
    {
        cout << path[ii] << " ";
    }
}

// 遍历二叉树,当找到叶子节点,并且当前剩余路径长度sum = 0
// (即路径长度等于当前指定长度)的时候打印路径信息。
// top表示路径的深度
void helper(binaryTreeNode *root, int sum, int path[], int top)
{
    path[top++] = root->data;
    sum -= root->data;
    if (root->lChild == NULL && root->rChild==NULL) // 叶子节点
    {
        if (sum == 0) // 路径长度等于指定长度
        {
            printPath(path, top);
            cout << endl;
        }
    }
    else
    {
        // 遍历左子树
        if (root->lChild != NULL)
            helper(root->lChild, sum, path, top);

        // 遍历右子树
        if (root->rChild!=NULL)
            helper(root->rChild, sum, path, top);
    }
    // 树深度自减,因为此时回撤到父节点,相应的sum也应该加回来
    top --;
    sum += root->data;
}

// 打印路径总函数
void printPaths(binaryTreeNode *root, int sum)
{
    int path[MAX_HEIGHT];
    helper(root, sum, path, 0);
}


int main()
{
    binaryTreeNode *BTree = NULL;
    CreateBinaryTree( &BTree );
    printPaths(BTree, 22);
    system( "pause" );
    return 0;
}

你可能感兴趣的:(C/C++,c语言,c++,递归,二叉树,遍历)