题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
#include<iostream> #include <vector> struct BinaryTreeNode{ int m_nValue; BinaryTreeNode * m_pRight; BinaryTreeNode * m_pLeft; }; void FindPath4Vars( BinaryTreeNode * pRoot, int expectedSum, std:: vector<int> path, int& currentSum ); void FindPath (BinaryTreeNode* pRoot, int expectedSum) { if (pRoot==NULL) return; std:: vector<int> path; int currentSum=0; FindPath4Vars (pRoot, expectedSum, path, currentSum); } void FindPath4Vars ( BinaryTreeNode * pRoot, int expectedSum, std:: vector<int> path, int& currentSum ) { currentSum+=pRoot->m_nValue; path. push_back (pRoot->m_nValue); //如果是叶结点,并且路径上结点的和等于输入的值 //打印出这条路径 bool isLeaf=pRoot->m_pLeft==NULL&&pRoot->m_pRight==NULL; if (currentSum==expectedSum&&isLeaf) { printf ("A path is found: "); std:: vector<int>:: iterator iter=path.begin(); for(; iter!=path.end();++iter) printf( "%d\t", *iter); printf( "\n"); } //如果不是叶结点,则遍历它的子结点 if (pRoot->m_pLeft !=NULL) FindPath4Vars (pRoot->m_pLeft, expectedSum, path, currentSum); if (pRoot->m_pRight!=NULL) FindPath4Vars (pRoot->m_pRight, expectedSum, path, currentSum); //在返回到父结点之前,在路径上删除当前结点, //并在currentSum中减去当前结点的值 currentSum-=pRoot->m_nValue; path.pop_back(); } int main() { BinaryTreeNode * root = new BinaryTreeNode; BinaryTreeNode * Node_5 = new BinaryTreeNode; BinaryTreeNode * Node_4 = new BinaryTreeNode; BinaryTreeNode * Node_7 = new BinaryTreeNode; BinaryTreeNode * Node_12 = new BinaryTreeNode; root->m_nValue = 10; Node_5->m_nValue = 5; Node_4->m_nValue = 4; Node_7->m_nValue = 7; Node_12->m_nValue = 12; root->m_pLeft=Node_5; root->m_pRight=Node_12; Node_5->m_pLeft = Node_4; Node_5->m_pRight = Node_7; Node_4->m_pLeft = NULL; Node_4->m_pRight = NULL; Node_7->m_pLeft = NULL; Node_7->m_pRight = NULL; Node_12->m_pLeft = NULL; Node_12->m_pRight = NULL; FindPath(root,22); }
时间: 2024-10-01 22:47:16